我試圖使我的自定義i18n行爲(目前沒有適合我需要的i18n組件,我檢查i18n-msg,i18n-next在stackoverflow上找到一些自定義實現...) 。聚合物1.0的行爲變化沒有傳播
它適用於第一代頁面,但當我嘗試更改我的語言時,標籤不會更新。
這裏我的代碼:
行爲:
var Polymer = Polymer || {};
/* Defining behavior's */
Polymer.I18n = Polymer.I18n ||{
properties: {
lang: {
type: String,
value: "en",
observer: '_onChangedLocale'
},
/** Exposes all translations */
translation: {
type: Object,
}
},
created: function() {
/* Initialisation */
this._onChangedLocale(Polymer.I18n.lang);
},
_onChangedLocale: function(locale) {
switch(locale) {
case 'de':
Polymer.I18n.translation = i18nDE;
break;
default:
Polymer.I18n.translation = i18nEN;
}
},
i18n: function(key) {
return Polymer.I18n.translation[key] ? Polymer.I18n.translation[key] : key;
}
}
組件實現的行爲:
<dom-module id="my-page">
<template>
[[i18n('hello')]]
<span on-click="onChangeLanguageDEClick">DE</span>
</template>
<script>
Polymer({
is: "my-page",
/* use localisation */
behaviors: [Polymer.I18n],
onChangeLanguageDEClick:function (event, detail, sender){
this.lang = 'de';
},
});
</script>
</dom-module>
i18nDE等i18nEN是的JSONObject包含翻譯。
當我點擊'DE'時,_onChangedLocale被調用,Polymer.I18n.translation被更新,但不是'[[i18n('hello')]]',如果沒有任何事情發生,他會保持第一個值。
我錯過了什麼嗎?聚合物文檔講'notifyPath',但我不明白如何在我的情況下使用它
解決方案: 問題是生命週期。 聚合物在組件屬性初始化之前對dom和數據綁定進行評估......當您使用this.my-prop時,您得到的錯誤表明您的屬性未定義(如果您未使用「創建的」回調)。或者像我這樣做,它只能在第一時間運作,但改變永遠不會受到影響。
它絕對沒有記錄,也沒有看到其他有關它的信息,但爲了擺脫這一點,我給第二個參數給我[[i18n('hello')]] => [[i18n('hello' ,翻譯)]]。函數i18n仍然只用於參數,但是這樣做,您告訴聚合函數,該函數使用特性「翻譯」,使他能夠更改生命週期並在特性初始化後評估表達式。現在它按預期工作...