假设我们有以下JS文件:
logic.js
function Car(){}
和这些QML文件:
comp1.qml
import 'qrc:/js/logic.js' as Logic
Item{
property var item: Logic
}
comp2.qml
import 'qrc:/js/logic.js' as Logic
Item{
property var item: Logic
}
如果你运行并评估,你会发现那些item
属性并不相同。为什么呢?
在我的应用程序中,在一个QML文件中new
一个对象,并且想要检查它是否是instanceof
构造函数,但是因为那些构造函数不相等(因为那些{ {1}}不是),Logic
运算符始终返回instanceof
。
答案 0 :(得分:4)
Code-Behind Implementation Resource文档解释了这种行为:
导入QML文档的大多数JavaScript文件都是导入它们的QML文档的有状态实现。在这些情况下,文档中定义的QML对象类型的每个实例都需要JavaScript对象和状态的单独副本才能正常运行。
导入JavaScript文件时的默认行为是为每个QML组件实例提供唯一的隔离副本。如果该JavaScript文件未导入任何带有.import语句的资源或模块,则其代码将在与QML组件实例相同的范围内运行,因此可以访问和操作在该QML组件中声明的对象和属性。否则,它将具有自己的唯一范围,如果需要,QML组件的对象和属性应作为参数传递给JavaScript文件的函数。
解决方案是将.pragma library
放在JavaScript文件的顶部。这将允许它由几个QML文件共享。
下一节Shared JavaScript Resources (Libraries)详细介绍了这一点。