自定义元素

时间:2015-06-10 04:04:00

标签: javascript internationalization polymer polymer-1.0

我有这两个自定义聚合物元素(Polymer 1.0.3):

  1. 显示要翻译的文字。
  2. 显示按钮以触发加载翻译。
  3. 我还有一个Behavior来保存翻译(json对象)并包含使翻译成为可能的所有功能。

    这是我期望发生的事情:

    1. 单击“元素2”中的按钮
    2. 翻译加载到行为
    3. 语言选择在行为
    4. 中设置
    5. 元素1中的文本使用已翻译的等效文件
    6. 进行更新

      步骤1 - 3发生,但4不发生。文本永远不会更新。如果Elements 1&amp ;;我可以让它工作。 2被组合为相同的元素,但如果它们是分开的(它们需要分开),则不会。

      如果你想知道“kick”属性,那就是我从Polymer 0.5中学到的东西。当两个元素组合在一起时,它就能完成工作,所以我认为当元素分开时,它是必要的。

      知道如何才能实现这一目标吗?我对另类范例持开放态度。

      代码

      这大致是我的代码的布局。我也做了plunker with a single-page test case

      的index.html

      <!doctype html>
      <html>
      
      <head>
        <script src="http://www.polymer-project.org/1.0/samples/components/webcomponentsjs/webcomponents-lite.js"></script>
        <link rel="import" href="http://www.polymer-project.org/1.0/samples/components/polymer/polymer.html">
        <link rel="import" href="behavior.html">
        <link rel="import" href="element1.html">
        <link rel="import" href="element2.html">
      </head>
      
      <body>
        <my-element></my-element>
        <another-element></another-element>
      </body>
      
      </html>
      

      元素1

      <dom-module id="my-element">
        <template>
          <p>{{localize(label, kick)}}</p>
        </template>
      </dom-module>
      
      <script>
        Polymer({
          is: 'my-element',
          behaviors: [
            behavior
          ],
          properties: {
            label: {
              type: String,
              value: 'original'
            }
          }
        });
      </script>
      

      元素2

      <dom-module id="another-element">
        <template>
          <button on-click="buttonClicked">load</button>
        </template>
      </dom-module>
      <script>
        Polymer({
          is: 'another-element',
          behaviors: [
            behavior
          ],
          buttonClicked: function() {
            this.registerTranslation('en', {
              original: 'changed'
            })
            this.selectLanguage('en');
          }
        });
      </script>
      

      行为

      <script>
        var behavior = {
          properties: {
            kick: {
              type: Number,
              value: 0
            },
            language: {
              type: String,
              value: 'fun'
            },
            translations: {
              type: Object,
              value: function() {
                return {};
              }
            }
          },
          localize: function(key, i) {
            if (this.translations[this.language] && this.translations[this.language][key]) {
              return this.translations[this.language][key];
            }
            return key;
          },
          registerTranslation: function(translationKey, translationSet) {
            this.translations[translationKey] = translationSet;
          },
          selectLanguage: function(newLanguage) {
            this.language = newLanguage;
            this.set('kick', this.kick + 1);
          }
        };
      </script>
      

1 个答案:

答案 0 :(得分:5)

首先,尽管概念是var alt = $(this).attr("alt"); 是实例之间共享数据的管道,但正如所写的那样,每个实例都有自己的behavior对象副本和translations属性。

其次,即使该数据已私有化以便可以共享,通过kick进行的kick绑定与修改localize(label, kick)的表达式的范围也不同(即{{ 1}} [{sic}这可能只是kick])。

要通知N个实例共享数据的更改,必须跟踪这些实例。执行此操作的一种好方法是附加事件侦听器。另一种方法是简单地保留一份清单。

以下是您的设计的示例实现:

this.set('kick', this.kick + 1);