Импорт JavaScript-ресурсов в QML
JavaScript-ресурсы могут быть импортированы QML-документами и другими JavaScript-ресурсами. JavaScript-ресурсы могут быть импортированы с помощью относительных или абсолютных URL-адресов. В случае относительного URL-адреса расположение определяется относительно расположения QML-документа или JavaScript-ресурса, который содержит импорт. Если файл скрипта недоступен, произойдет ошибка. Если JavaScript должен быть получен из сетевого ресурса, статус компонента status устанавливается в "Loading" до тех пор, пока скрипт не будет загружен.
JavaScript-ресурсы также могут импортировать QML-модули и другие JavaScript-ресурсы. Синтаксис инструкции импорта внутри JavaScript-ресурса немного отличается от синтаксиса инструкции импорта в QML-документе, который подробно описан ниже.
Импорт JavaScript-ресурса из QML-документа
QML-документ может импортировать JavaScript-ресурс с помощью следующего синтаксиса:
import "ResourceURL" as Qualifier
Например:
import "jsfile.js" as Logic
Импортированные JavaScript-ресурсы всегда квалифицируются с помощью ключевого слова "as". Квалификатор для JavaScript-ресурсов должен начинаться с заглавной буквы и быть уникальным, так что всегда существует однозначное соответствие между квалификаторами и JavaScript-файлами. (Это также означает, что квалификаторы не могут иметь то же имя, что и встроенные JavaScript-объекты, такие как Date и Math).
Функции, определенные в импортированном JavaScript-файле, доступны объектам, определенным в импортирующем QML-документе, через синтаксис "Qualifier.functionName(params)". Функции в JavaScript-ресурсах могут принимать параметры, тип которых может быть любым из поддерживаемых QML-базовых типов или типов объектов, а также обычные типы JavaScript. При вызове таких функций из QML к параметрам и возвращаемым значениям будут применяться обычные правила преобразования типов данных data type conversion rules.
Импорты внутри JavaScript-ресурсов
В QtQuick 2.0, была добавлена поддержка, позволяющая JavaScript-ресурсам импортировать другие JavaScript-ресурсы и также QML-пространства имён с помощью варианта стандартного QML-синтаксиса импорта (где все описанные ранее правила и квалификации применяются).
Из-за возможности импорта JavaScript-ресурсом другого скрипта или QML-модуля таким образом в QtQuick 2.0, определены некоторые дополнительные семантики:
- скрипт с импортами не будет наследовать импорты из QML-документа, который его импортировал (например, доступ к Component.errorString будет неудачным)
- скрипт без импортов будет наследовать импорты из QML-документа, который его импортировал (например, доступ к Component.errorString будет успешным)
- общий скрипт (т. е. определенный как .pragma library) не наследует импорты ни от какого QML-документа, даже если он не импортирует другие скрипты или модули
Первая семантика концептуально верна, учитывая, что определённый скрипт может быть импортирован любым количеством QML-файлов. Вторая семантика сохранена для обратной совместимости. Третья семантика остаётся без изменений по сравнению с текущей семантикой для общих скриптов, но здесь она уточнена в отношении нового возможного случая (где скрипт импортирует другие скрипты или модули).
Импорт JavaScript-ресурса из другого JavaScript-ресурса
JavaScript-ресурс может импортировать другой таким образом:
.import "filename.js" as Qualifier
Например:
.import "factorial.js" as MathFunctions
Импорт QML-модуля из JavaScript-ресурса
JavaScript-ресурс может импортировать QML-модуль следующим образом:
.import TypeNamespace MajorVersion.MinorVersion as Qualifier
Например:
.import Qt.test 1.0 as JsQtTest
В частности, это может быть полезно для доступа к функциональности, предоставляемой через тип singleton; см. qmlRegisterSingletonType() для получения дополнительной информации.
Примечание: Синтаксис .import не работает для скриптов, используемых в WorkerScript
Включение JavaScript-ресурса из другого JavaScript-ресурса
Когда JavaScript-файл импортируется, он должен импортироваться с квалификатором. Функции в этом файле затем доступны из импортирующего скрипта через квалификатор (то есть, как Qualifier.functionName(params)). Иногда желательно, чтобы функции были доступны в контексте импорта без необходимости квалификации, и в этом случае может быть использована функция Qt.include() для включения одного JavaScript-файла из другого. Это копирует все функции из другого файла в текущее пространство имён файла, но игнорирует все pragmas и импорты, определённые в этом файле.
Например, QML-код ниже слева вызывает showCalculations() в script.js, который в свою очередь может вызывать factorial() в factorial.js, так как он включил factorial.js с помощью Qt.include().
import QtQuick 2.0
import "script.js" as MyScript
Item {
width: 100; height: 100
MouseArea {
anchors.fill: parent
onClicked: {
MyScript.showCalculations(10)
console.log("Call factorial() from QML:",
MyScript.factorial(10))
}
}
} |
// script.js
Qt.include("factorial.js")
function showCalculations(value) {
console.log(
"Call factorial() from script.js:",
factorial(value));
} |
// factorial.js
function factorial(a) {
a = parseInt(a);
if (a <= 0)
return 1;
else
return a * factorial(a - 1);
} |
Обратите внимание, что вызов Qt.include() копирует все функции из factorial.js в пространство имён MyScript, что означает, что QML-компонент также может получить доступ к factorial() напрямую как MyScript.factorial().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/qtqml-javascript-imports.html