2016-09-14 68 views
0

报价:“一些JS文件的行为更像库 - 它们从不直接操纵QML组件实例” - 中间地带?从<a href="http://doc.qt.io/qt-5/qtqml-javascript-resources.html#shared-javascript-resources-libraries" rel="nofollow">Defining JavaScript Resources In QML</a>

一些JavaScript文件更像库 - 它们提供了一组采取输入和输出的计算,但从未直接操纵QML组件实例辅助功能。

如果我想要一个JS文件,这两个:

  • 操纵QML组件实例(传递给它作为参数)
  • 没有得到其存储代码和数据的副本对于每个导入它的QML组件实例?

我可以得到“没有数据存储在每个实例”的一部分,好吧,没有把全局变量放在JS文件中。但是,由于一些奇怪的原因,“代码”部分的副本似乎也存储在每个实例中。我不明白这是为什么,但我想知道我是否可以绕过它,并且花多少钱。

+0

JS代码可能有点不稳定,所以共享它可能实际上并不是你想要的。我会避免这种情况,除非你有充分的证据证明你需要它,因为你需要copy-on-write(/ assignment)来配合它,所以组件不会改变彼此的行为。 – ssube

+0

您能否为本声明提供证据:'但是,由于某种奇怪的原因,“代码”部分的副本似乎也存储在每个实例中。“ – Mitch

+0

@Mitch:那么,我链接到的文档页面说这接下来:“因为每个QML组件实例具有这些库的唯一副本是浪费的[...]” –

回答

2

我认为你从文档中引用的那一行是不正确的,或者至少措辞很差;你仍然可以拥有一个其中包含.pragma library的JS文件,并操作作为其函数参数传入的QML对象。这句话可能是指previous section

+0

谢谢,我试过了你的方式,它的工作。该死的,那些qt doc作家:)我会报告给他们。 –

+2

已报告[此处](https://bugreports.qt.io/browse/QTWEBSITE-733)。 –

1

要跨qml文件共享数据,请考虑使用qml Singleton

对于数据共享目的,我不会建议使用.pragma library(@Mitch)出于以下原因。

  1. .pragma library JS提供QML对象操纵有限功能。尽管可以使用.pragma library js,完成简单的qml对象操作(如属性读取/写入),但它不允许创建/删除qml对象(如同在常规非库js中一样)。它会吸引你的应用程序变得动态。

  2. .pragma library仅创建一个实例仅仅是Qt实现中的一种优化。它是永不保证Qt创建一个实例,也不会真正分享您的数据。

  3. 那么,.pragma library不是从一开始就做数据共享工作的。只是,不要试图这样做。

相关问题