
Ich habe Probleme, die in Ubuntu.Components 0.1 enthaltene i18n-Bibliothek zur Verwendung in einer JS-Datei zu importieren. Ich bin zum ersten Mal auf meine Frage/mein Problem gestoßen, als ich die Ubuntu Touch-Kernanwendung „Clock“ gehackt habe, aber ich konnte das Verhalten mithilfe eines stark vereinfachten Codeausschnitts reproduzieren, den ich unten eingefügt habe.
Wenn ich diesen Code auf meinem 14.04-Desktop mit dem UbuntuSDK ausführe, erhalte ich die Fehlermeldung:
CurrencyConverter/ConverterUtils.js:5: TypeError: Eigenschaft ‚tr‘ des Objekts [Objekt Object] ist keine Funktion
Es scheint, dass ich entweder mit der falschen Syntax auf die Funktion verweise oder dass mit meiner Importsyntax etwas nicht stimmt.
Währungsrechner.qml
import QtQuick 2.0
import Ubuntu.Components 0.1
import "ConverterUtils.js" as Utils
MainView {
id: root
applicationName: "CurrencyConverter"
width: units.gu(100)
height: units.gu(75)
property real margins: units.gu(2)
property real buttonWidth: units.gu(9)
Page {
title: Utils.getTitle()
}
}
ConverterUtils.js
.pragma library
.import Ubuntu.Components 0.1 as Foo
function getTitle() {
return i18n.tr("Currency Converter");
}
Anmerkungen
1) Das ".pragma-Bibliothek"-Zeile (soweit ich weiß) soll aussagen: "Laden Sie nur eine Version dieser Bibliothek und teilen Sie sie mit allen Stellen, an denen dieses JS in dieser App enthalten ist. http://qt-project.org/doc/qt-4.8/qdeclarativejavascript.html
2) Wenn ich das ".pragma-Bibliothek"-Zeile, wie der obige Link andeutet, erbt die JS-Datei die Importe der QML-Datei, aus der sie verwendet wird. Wenn ich also diese Zeile entferne, kann ich auf i18n zugreifen. Das macht Sinn. Da jedoch die App „Uhr“, bei der ich ursprünglich auf dieses Problem gestoßen bin, die .pragma-Direktive verwendet (angeblich aus Leistungsgründen), halte ich das Entfernen dieser Zeile nicht für eine gute Lösung.
3) Die „.import“-Syntax zum Importieren von QML-Bibliotheken in eine JS-Datei habe ich hier gefunden:http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html Ich habe es vielleicht falsch interpretiert, aber für mich sieht es richtig aus.
4) Interessant ist, dass beim Bearbeiten dieses Codes mit UbuntuSDK (QtCreator) die Eingabe von „Foo.“ „i18n“ als Autovervollständigungsvorschlag anzeigt. Wenn Sie „Foo.i18n.“ eingeben, wird „tr()“ als einer der Autovervollständigungsvorschläge angezeigt. Es scheint also, als würde UbuntuSDK meinen „Foo“-Qualifizierer/Namespace erkennen. Oder vielleicht berücksichtigt die Autovervollständigung importierte Bibliotheken nicht. Ich fand es einfach interessant.
Meine Frage lautet also: Weiß jemand, was dieses Verhalten verursacht? Ich kann das Problem wahrscheinlich umgehen, indem ich i18n.tr() aus einer QML-Datei statt aus einer JS-Hilfsbibliothek aufrufe, aber ich bin neugierig, was ich falsch gemacht habe. Irgendwelche Vorschläge?
Antwort1
Ich habe also eine Teillösung für das Problem, das ich gesehen habe.
Nach dem Betrachten des Codes für die RSS Reader-Kernanwendung sieht es so aus, als ob bei Verwendung der Direktive „.pragma library“ das i18n-Modul an die aufgerufene JavaScript-Funktion übergeben werden muss. Dadurch erhält der JavaScript-Code die Möglichkeit, Funktionen mithilfe des übergebenen Objekts aufzurufen.
Das JavaScript würde beispielsweise ungefähr so aussehen:
function getTitle(i18n) {
return i18n.tr("CurrencyConverter");
}
Dies beantwortet zwar nicht wirklich das „Warum“ meiner ursprünglichen Frage, sollte aber für jeden, der auf dieses Problem stößt, eine geeignete Problemumgehung sein.