Spec-Zone.ru › Qt 5.6

Импорт JavaScript-ресурсов в QML

JavaScript-ресурсы могут быть импортированы QML-документами и другими JavaScript-ресурсами. JavaScript-ресурсы могут быть импортированы с использованием относительных или абсолютных URL-адресов. В случае относительного URL-адреса расположение определяется относительно расположения QML-документа или JavaScript-ресурса, содержащего импорт. Если файл скрипта недоступен, произойдёт ошибка. Если JavaScript необходимо извлечь из сетевого ресурса, статус компонента status устанавливается в «Загрузка» до тех пор, пока скрипт не будет загружен.

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 будут применяться обычные правила преобразования типов данных данных.

Импорты внутри 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

В частности, это может быть полезно для доступа к функциональности, предоставляемой через тип одиночки; см. 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/archives/qt-5.6/qtqml-javascript-imports.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API