为什么QML引擎多次实例化同一个脚本?

时间:2017-02-27 10:57:10

标签: javascript qt qml

假设我们有以下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

1 个答案:

答案 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)详细介绍了这一点。