2016-02-05 66 views
2

我試圖使我的自定義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仍然只用於參數,但是這樣做,您告訴聚合函數,該函數使用特性「翻譯」,使他能夠更改生命週期並在特性初始化後評估表達式。現在它按預期工作...

回答

0

謝謝您的回答,遺憾的是這是我第一次嘗試(基於https://www.polymer-project.org/1.0/docs/devguide/behaviors.html),它不工作也沒有。

我找出問題(這不是行爲相對聚合物):

看我的國際化組件的這種極簡代碼:

<dom-module id="my-page"> 
<template> 
    [[expr('toto',word)]] 
    <span on-click="onClickButton">Change plz</span> 
</template> 
<script> 
    Polymer({ 
     is: "my-page", 
     /* use localisation */ 
     properties : { 
      word: { 
       type: Object, 
      } 
     }, 
     ready: function() { 
      this.onChange('Try it'); 
     }, 
     onClickButton:function (event, detail, sender, arg){ 
      this.onChange('CHANGED !'); 
     }, 
     onChange:function (arg){ 
      var json = {}; 
      json.toto = arg; 
      this.word = json; 
     }, 
     expr:function(arg) { 
      return this.word[arg]; 
     } 
    }); 
</script> 

此代碼的工作(當我在「變點擊綁定更新如預期),但我不明白爲什麼,因爲我在這條線上犯了一個錯誤: [[expr('toto',word)]]。

我的函數'expr'沒有采用第二個參數,並猜測是什麼。如果我像[[expr('toto')]]一樣去除它,它就不再工作了(無法讀取未定義的屬性'toto')!oO

有人可以解釋我這種行爲,然後我就可以將它擴展到我的i18n組件?

0

我強烈建議有你自己的命名空間,而不是使用聚合物。 如果您的行爲定義現在不存在,請將import添加到polymer.html中。

嘗試做出以下更改,看看它是否有效。

/* 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(this.lang); 
     }, 
     _onChangedLocale: function(locale) { 
      switch(locale) { 
       case 'de': 
        this.translation = i18nDE; 
        break; 
       default: 
        this.translation = i18nEN; 
      } 
     }, 
     i18n: function(key) { 
      return this.translation[key] ? this.translation[key] : key; 
     }