2017-02-27 95 views
2

假设我们有以下的JS文件:为什么QML引擎多次实例化相同的脚本?

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构造函数或没有,但因为这些构造函数是不相等的(因为这些Logic s为没有),instanceof操作员始终返回false

+0

限定符和JavaScript文件之间总是存在一对一映射。我想这就是为什么那些“逻辑”是不同的。 –

+0

您可能会尝试使用QML-Singleton-File,您可以在其中导入js文件并获得您的属性。然后你导入这个单例。 – derM

回答

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)会对此进行更详细的说明。