使用嵌套元素了解Polymer事件和数据绑定?

时间:2014-09-29 20:21:11

标签: javascript polymer web-component

我有三个嵌套的聚合物元素。它们中的每一个都有默认值,可以使用已发布的值覆盖它们。

但我不能这样做。

create事件中不存在已发布的值。在ready事件中,子元素已经ready并且未更新。

I made example js-bin.

实际上,单独文件中的每个元素。这是一个例子。

Object.assign - 用于合并对象的es6方法(使用es6-shim)。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <script src="//cdnjs.cloudflare.com/ajax/libs/es6-shim/0.18.0/es6-shim.js"></script>
  <script src="http://www.polymer-project.org/components/platform/platform.js"></script>
  <link href="http://www.polymer-project.org/components/polymer/polymer.html" rel="import"> 
</head>
<body unresolved>

  <polymer-element name="my-field" attributes="ask">
  <template>
    <span><content></content> Message: {{message}}</span>
  </template>
  <script>
    (function() {
      Polymer('my-field', {
        defaultAsk: { message: "Hello from Field!" },
        created: function() {
          console.log('created-field', this.ask, this.message);  
          Object.assign(this, this.defaultAsk);
        },
        ready: function() {
          console.log('ready-field', this.ask, this.message);
          Object.assign(this, this.ask);
        }
      });
    })();
  </script>
  </polymer-element>

  <polymer-element name="my-shelf" attributes="ask">
  <template>
    <my-field ask="{{field}}"><content></content></my-field>
  </template>
  <script>
    (function() {
      Polymer('my-shelf', {
        defaultAsk: { field: { message: "Hello from Shelf!" } },
        created: function() {
          console.log('created-shelf', this.ask, this.field);  
          Object.assign(this, this.defaultAsk);
        },
        ready: function() {
          console.log('ready-shelf', this.ask, this.field);
          Object.assign(this, this.ask);
        }
      });
    })();
  </script>
  </polymer-element>

  <polymer-element name="my-cabinet">
  <template>
    <my-shelf ask="{{shelf}}"><content></content></my-shelf>        
  </template>   
  <script>
    (function() {
      Polymer('my-cabinet', {
        ask:        { shelf: { field: { message: "Hello from outside!" } } },
        defaultAsk: { shelf: { field: { message: "Hello from Cabinet!" } } },
        created: function() {
          console.log('created-cabinet', this.ask, this.shelf);  
          Object.assign(this, this.defaultAsk);
        },
        ready: function() {
          console.log('ready-cabinet', this.ask, this.shelf);
          Object.assign(this, this.ask);
        }
      });
    })();
  </script>
  </polymer-element>

  <my-cabinet>Yo!</my-cabinet>

</body>
</html>

1 个答案:

答案 0 :(得分:1)

如果只使用一个对象通过许多嵌套元素,那么一切都会按照我的意愿运作。

Example on js-bin

我的所有元素扩展到另一个(my-elem)只是为了删除doubled代码并使我的示例更具可读性。 ask - 绑定数据(从my-cabinet到my-field)。 Click - 更改数据。

不幸的是,在jsbin上,用于查看已触发的消息的控制台很糟糕。

我使用嵌套元素制作了小型链事件模式。也许,它会帮助别人。

enter image description here

P.S。不要因为我的英语不好而踢我。