2016-08-01 32 views
1

我有进口JavaScript库一个QM​​L文件:QML的JavaScript导入空

import "qrc:/scripts/protobuf.js" as PB 

这个库modifies the 'global' object安装过程中。简单来说,JS库是:

.pragma library 
(function(global){ 
    global.dcodeIO = global.dcodeIO || {}; 
    global.dcodeIO.ProtoBuf = {}; // In reality, a complex object 
})(this); 

在Windows和Linux上,它按预期工作;后来在我的QML文件中,我编写了var ProtoBuf = PB.dcodeIO.ProtoBuf;,它发现dcodeIO属性添加到'全局'对象,并正确给我我需要的对象。

但是,在另一个平台上,相同的代码不起作用。我得到一个错误,它cannot read property ProtoBuf of undefined。我在我的QML中添加了调试行并参见:

console.log(PB.dcodeIO);    //-> undefined 
for (var k in PB) console.log(k,PB[k]); //-> (no enumerable properties logged) 

然而,库中的JavaScript代码已加载并运行。如果我在上面链接的行之后加上console.log(global.dcodeIO),我会看到[object Object]

区别是什么?我如何确定为什么Qt运行我的JavaScript文件,但没有成功地将全局对象与PB关联?

+0

在哪个平台上不起作用? – Mitch

+0

@Mitch它是在NVIDIA PX2上运行的NVIDIA V4L(Vibrante 4 Linux)。 FWIW我现在正在调试Qt开发人员的问题,目前还没有答案。 – Phrogz

+0

Qt 5.9上的相同问题 – uralbash

回答

0

看起来问题在于5.7.0-alpha的构建错误。升级到5.7.0版本并重建已消除此问题。

1

JavaScript Environment Restrictions下所列的点可能是与此有关:

JavaScript代码不能修改全局对象。

在QML中,全局对象是常量 - 现有属性不能被修改或删除,也不会创建新属性。

...

试图修改全局对象 - 无论是或明或暗地 - 将导致异常。如果未被捕获,将导致打印警告,其中包括违规代码的文件和行号。

虽然你说它在两个平台上工作,但不是三分之一,所以也许你的使用是正确的,这是一个错误。

还有这一点:

全球代码在范围缩小运行。

虽然这一点似乎是从加载的脚本访问QML对象。

在这个问题上,我一直不清楚文档。 http://doc.qt.io/qt-5/qjsengine.html#globalObject说:

返回此引擎的全局对象。

默认情况下,全局对象包含属于ECMA-262的内置对象,如数学,日期和字符串。此外,您可以设置全局对象的属性,使您的扩展可用于所有脚本代码。脚本代码中的非局部变量将被创建为全局对象的属性,以及全局代码中的局部变量。

这似乎与上面列出的限制相矛盾。还有this

注意:globalObject()函数不能用于修改QQmlEngine的全局对象。有关更多信息,请参阅JavaScript环境限制。