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

Javascript 为什么QML引擎多次实例化同一个脚本?,javascript,qt,qml,Javascript,Qt,Qml,假设我们有以下JS文件: logic.js function Car(){} 这些QML文件: comp1.qml import 'qrc:/js/logic.js' as Logic Item{ property var item: Logic } import 'qrc:/js/logic.js' as Logic Item{ property var item: Logic } comp2.qml import 'qrc:/js/logic.js' as Logi

假设我们有以下JS文件:

logic.js

function Car(){}
这些QML文件:

comp1.qml

import 'qrc:/js/logic.js' as Logic

Item{
    property var item: Logic
}
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
}
import 'qrc:/js/logic.js' as Logic

Item{
    property var item: Logic
}
如果运行并计算,您将看到这些
属性不相等。为什么?

在我的应用程序中,在一个QML文件中,我
new
一个对象,并想检查它是否是
instanceof
构造函数,但由于这些构造函数不相等(因为那些
逻辑不相等),
instanceof
操作符总是返回
false

文档解释了这种行为:

导入到QML文档中的大多数JavaScript文件都是导入它们的QML文档的有状态实现。在这些情况下,文档中定义的QML对象类型的每个实例都需要一个单独的JavaScript对象和状态副本,以便正确运行

导入JavaScript文件时的默认行为是为每个QML组件实例提供唯一、独立的副本。如果该JavaScript文件没有使用.import语句导入任何资源或模块,则其代码将在与QML组件实例相同的范围内运行,因此可以访问和操作该QML组件中声明的对象和属性。否则,它将有自己独特的作用域,如果需要,QML组件的对象和属性应该作为参数传递给JavaScript文件的函数

解决方案是将
.pragma库
放在JavaScript文件的顶部。这将允许多个QML文件共享它


下一节将详细介绍这一点。

限定符和JavaScript文件之间始终存在一对一的映射。我认为这就是为什么那些
逻辑不同的原因。您可以尝试使用QML单例文件,在其中导入js文件,并拥有您的属性。现在有一个Bug(Qt5.13),所以“.pragma library”通常不起作用,特别是与Qt Quick Compiler一起如果有Bug报告,你应该把它放在这里,这样人们就可以检查它何时被修复了。好的一点,给你:它说的是Qt5.4,但我在Qt5.13中体验到了它。请注意,单例也会受到同样的影响(尚未发现该问题的bug)