QML共享的JavaScript资源(库)
默认情况下,从QML导入的JavaScript文件与QML组件共享它们的上下文。这意味着JavaScript文件可以访问相同的QML对象,并且可以对其进行修改。因此,每个导入都必须具有这些文件的唯一副本。
上一节介绍了JavaScript文件的有状态导入。但是,某些JavaScript文件是无状态的,并且在某种意义上更像可重用的库,因为它们提供了一组帮助程序函数,这些函数不需要从其导入位置中获取任何内容。如果使用特殊的实用标记来标记此类库,则可以节省大量内存并加快QML组件的实例化,如以下示例所示。
// factorial.js .pragma library var factorialCount = 0; function factorial(a) { a = parseInt(a); // factorial recursion if (a > 0) return a * factorial(a - 1); // shared state factorialCount += 1; // recursion base-case. return 1; } function factorialCallCount() { return factorialCount; }
编译指示必须出现在任何JavaScript代码(注释除外)之前。
请注意,多个QML文档可以导入"factorial.js"
并调用它提供的factorial和factorialCallCount函数。JavaScript导入的状态在导入它的QML文档之间共享,因此,在从未调用阶乘函数的QML文档中调用时,factorialCallCount函数的返回值可能为非零。
例如:
// Calculator.qml import QtQuick 2.0 import "factorial.js" as FactorialCalculator // This JavaScript resource is only // ever loaded once by the engine, // even if multiple instances of // Calculator.qml are created. Text { width: 500 height: 100 property int input: 17 text: "The factorial of " + input + " is: " + FactorialCalculator.factorial(input) }
尽管可以将QML值作为函数参数传递,但共享它们时,.pragma库文件无法直接访问QML组件实例对象或属性。
英文官方地址:https://doc.qt.io/qt-5/qtqml-javascript-resources.html#shared-javascript-resources-libraries