Javascript 为什么QML引擎多次实例化同一个脚本?
假设我们有以下JS文件: logic.jsJavascript 为什么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
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)