我在导入 Ubuntu.Components 0.1 中包含的 i18n 库以用于 JS 文件时遇到了麻烦。我最初在破解“时钟”Ubuntu Touch 核心应用程序时遇到了我的问题/问题,但我能够使用一个简化得多的代码片段重现该行为,因此我将其粘贴在下面。
当我使用 UbuntuSDK 在 14.04 桌面上运行此代码时,收到错误消息:
CurrencyConverter/ConverterUtils.js:5:TypeError:对象 [object Object] 的属性“tr”不是函数
看起来要么我使用错误的语法引用了该函数,要么我的导入语法有问题。
货币转换器.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");
}
笔记
1)“.pragma 库“这一行(据我所知)的意思是:“只加载这个库的一个版本,并在此应用程序包含这个 JS 的所有地方之间共享它。 http://qt-project.org/doc/qt-4.8/qdeclarativejavascript.html
2)当我删除“.pragma 库“行,正如上面的链接所暗示的,JS 文件继承了它所使用的 QML 文件的导入。所以当我删除该行时,我可以访问 i18n。这是有道理的。但是,由于我最初遇到此问题的“时钟”应用程序使用了 .pragma 指令(表面上是出于性能原因),我认为删除它不是一个好的解决方案。
3)我在这里找到了将 QML 库导入 JS 文件的“.import”语法:http://www.qt-project.org/doc/qt-5/qtqml-javascript-imports.html 我可能误解了它,但在我看来它是正确的。
4) 有趣的是,在使用 UbuntuSDK (QtCreator) 编辑此代码时,输入“Foo.”会出现“i18n”作为自动完成建议。输入“Foo.i18n.”会出现“tr()”作为自动完成建议之一。因此,UbuntuSDK 似乎识别了我的“Foo”限定符/命名空间。或者自动完成功能可能没有考虑导入的库。只是觉得这很有趣。
所以我的问题是:有人知道是什么导致了这种行为吗?我可能可以通过从 QML 文件而不是 JS 实用程序库调用 i18n.tr() 来解决该问题,但我很想知道我做错了什么。有什么建议吗?
答案1
所以我对我所看到的问题有一个部分解决方案。
查看 RSS 阅读器核心应用程序的代码后,发现使用“.pragma library”指令时,需要将 i18n 模块传递给正在调用的 JavaScript 函数。这使 JavaScript 代码能够使用传入的对象调用函数。
例如,JavaScript 看起来类似于:
function getTitle(i18n) {
return i18n.tr("CurrencyConverter");
}
这并没有真正回答我最初的问题的“为什么”,但对于遇到此问题的任何人来说,这应该是一个合适的解决方法。