一些JavaScript文件更像库 - 它们提供了一组采取输入和输出的计算,但从未直接操纵QML组件实例辅助功能。
如果我想要一个JS文件,这两个:
- 操纵QML组件实例(传递给它作为参数)
- 没有得到其存储代码和数据的副本对于每个导入它的QML组件实例?
我可以得到“没有数据存储在每个实例”的一部分,好吧,没有把全局变量放在JS文件中。但是,由于一些奇怪的原因,“代码”部分的副本似乎也存储在每个实例中。我不明白这是为什么,但我想知道我是否可以绕过它,并且花多少钱。
一些JavaScript文件更像库 - 它们提供了一组采取输入和输出的计算,但从未直接操纵QML组件实例辅助功能。
如果我想要一个JS文件,这两个:
我可以得到“没有数据存储在每个实例”的一部分,好吧,没有把全局变量放在JS文件中。但是,由于一些奇怪的原因,“代码”部分的副本似乎也存储在每个实例中。我不明白这是为什么,但我想知道我是否可以绕过它,并且花多少钱。
我认为你从文档中引用的那一行是不正确的,或者至少措辞很差;你仍然可以拥有一个其中包含.pragma library
的JS文件,并操作作为其函数参数传入的QML对象。这句话可能是指previous section。
谢谢,我试过了你的方式,它的工作。该死的,那些qt doc作家:)我会报告给他们。 –
已报告[此处](https://bugreports.qt.io/browse/QTWEBSITE-733)。 –
要跨qml文件共享数据,请考虑使用qml Singleton。
对于数据共享目的,我不会建议使用.pragma library
(@Mitch)出于以下原因。
.pragma library
JS提供QML对象操纵有限功能。尽管可以使用.pragma library
js,完成简单的qml对象操作(如属性读取/写入),但它不允许创建/删除qml对象(如同在常规非库js中一样)。它会吸引你的应用程序变得动态。
.pragma library
仅创建一个实例仅仅是Qt实现中的一种优化。它是永不保证Qt创建一个实例,也不会真正分享您的数据。
那么,.pragma library
不是从一开始就做数据共享工作的。只是,不要试图这样做。
JS代码可能有点不稳定,所以共享它可能实际上并不是你想要的。我会避免这种情况,除非你有充分的证据证明你需要它,因为你需要copy-on-write(/ assignment)来配合它,所以组件不会改变彼此的行为。 – ssube
您能否为本声明提供证据:'但是,由于某种奇怪的原因,“代码”部分的副本似乎也存储在每个实例中。“ – Mitch
@Mitch:那么,我链接到的文档页面说这接下来:“因为每个QML组件实例具有这些库的唯一副本是浪费的[...]” –