
我在匯入 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 util 庫調用 i18n.tr() 來解決這個問題,但我很想知道我做錯了什麼。有什麼建議麼?
答案1
所以我對我所看到的問題有一個部分解決方案。
在查看 RSS 閱讀器核心應用程式的程式碼後,看起來當使用「.pragma library」指令時,需要將 i18n 模組傳遞給正在呼叫的 JavaScript 函數。這使得 JavaScript 程式碼能夠使用傳入的物件呼叫函數。
例如,JavaScript 看起來像:
function getTitle(i18n) {
return i18n.tr("CurrencyConverter");
}
這並不能真正回答我最初問題的“原因”,但對於遇到此問題的任何人來說,這應該是一個合適的解決方法。