聚合物1.0行为变化不会传播

时间:2016-02-05 16:18:18

标签: polymer

我试图制作我的自定义i18n行为(目前没有适合我需要的i18n组件,我检查i18n-msg,接下来是在stackoverflow上发现的一些自定义实现......)。

它适用于第一页生成,但当我尝试更改语言时,标签不会更新。

这是我的代码:

行为:

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 et i18nEN是包含翻译的JsonObject。

当我点击&#39; DE&#39;,调用_onChangedLocale时,Polymer.I18n.translation会更新,但不会更新&#39; [[i18n(&#39; hello&#39;)]]& #39;如果什么也没发生的话,那就是他的第一个价值。

我错过了什么吗?聚合物医生谈论&#39; notifyPath&#39;但我不明白如何在我的案例中使用它

决议: 问题是生命周期。 聚合物在组件属性初始化之前评估dom和数据绑定...当你使用this.my时,你得到的错误表明你的属性没有被定义(如果你没有使用&#39;创建&#39;回调) -支柱。或者像我一样,它只是第一次起作用,但改变永远不会被重新发生。

它绝对没有记录,也没有看到有关它的其他信息,但为了摆脱它,我给我的第二个参数[[i18n(&#39; hello&#39;)] ] =&gt; [[I18N(&#39;你好&#39;,翻译)〕〕。功能i18n仍然只是在论证,但这样做,你告诉聚合物该功能使用一个属性&#39;翻译&#39;允许他更改生命周期并在属性初始化后评估表达式。现在它按预期工作......

2 个答案:

答案 0 :(得分:0)

我强烈建议您拥有自己的命名空间,而不是使用Polymer。 如果现在不存在,请在行为定义中将polymer.html添加到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;
        }

答案 1 :(得分:0)

感谢您的回答,不幸的是,这是我的第一次尝试(基于https://www.polymer-project.org/1.0/docs/devguide/behaviors.html),但它也不起作用。

我孤立了问题(这不是聚合物行为的相对):

查看我的i18n组件的极简主义代码:

<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>

此代码有效(当我点击'更改plz'时,绑定会按预期更新)但我不明白为什么因为我在这一行上犯了一个错误: [[EXPR( 'TOTO',字)〕〕。

我的函数'expr'没有第二个参数,猜猜是什么。如果我像[[expr('toto')]]那样删除它,它就不再起作用了(无法读取未定义的属性'toto')! OO

有人可以向我解释这种行为然后我可以将它扩展到我的i18n组件吗?