15

有时我们可能需要将自定义元素动态添加到上下文中。然后:

  • 插入的聚合物可以接收一些与上下文中的另一个属性绑定的属性,因此它可以相应地改变。

  • 在聚合物 0.5 中,我们可以使用 PathObserver 将属性绑定到最近添加的组件的上下文属性。但是,我在聚合物 1.0 中没有找到解决方法或等效方法。

我为 0.5 创建了一个示例,为 1.0 创建了一个示例。请参阅下面的聚合物代码,它使注射。为了清楚起见,您还可以查看完整的 plunker 示例。

Ej 0.5:

<polymer-element name="main-context">
  <template>
    <one-element foo="{{foo}}"></one-element>
    <div id="dynamic">
    </div>
  </template>
  <script>
    Polymer({
      domReady: function() {
        // injecting component into polymer and binding foo via PathObserver
        var el = document.createElement("another-element");
        el.bind("foo", new PathObserver(this,"foo"));
        this.$.dynamic.appendChild(el);
      }
    });
  </script>
</polymer-element>

请查看完整的 plunkr 示例:http ://plnkr.co/edit/2Aj3LcGP1t42xo1eq5V6?p=preview

Ej 1.0:

<dom-module id="main-context">
  <template>
    <one-element foo="{{foo}}"></one-element>
    <div id="dynamic">
    </div>
  </template>
</dom-module>
<script>
  Polymer({
    is: "main-context",
    ready: function() {
      // injecting component into polymer and binding foo via PathObserver
      var el = document.createElement("another-element");
      // FIXME, there's no a path observer: el.bind("foo", new PathObserver(this,"foo"));
      this.$.dynamic.appendChild(el);
    }
  });
</script>

请查看完整的 plunkr 示例:http ://plnkr.co/edit/K463dqEqduNH10AqSzhp?p=preview

您知道聚合物 1.0 的一些解决方法或等效方法吗?

4

2 回答 2

9

目前,没有直接的方法可以做到这一点。foo您应该通过侦听父元素属性的更改并侦听以foo-changed编程方式创建的元素的事件来手动执行双重绑定。

<script>   
Polymer({
  is: "main-context",
  properties: {
    foo: {
      type: String,
      observer: 'fooChanged'
    }
  },
  ready: function() {
    var self = this;
    var el = this.$.el = document.createElement("another-element");

    //set the initial value of child's foo property
    el.foo = this.foo;
    //listen to foo-changed event to sync with parent's foo property
    el.addEventListener("foo-changed", function(ev){
      self.foo = this.foo;
    });

    this.$.dynamic.appendChild(el);
  },
  //sync changes in parent's foo property with child's foo property
  fooChanged: function(newValue) {
    if (this.$.el) {
      this.$.el.foo = newValue;
    }
  }
});
</script>

您可以在这里看到一个工作示例:http: //plnkr.co/edit/mZd7BNTvXlqJdJ5xSq0o ?p=preview

于 2015-06-04T21:31:53.587 回答
7

不幸的是,我认为不可能通过“干净”的方式做到这一点。要替换 Path Observer,我们必须将“foo”值更改上的链接添加到动态元素。第一步是观察“foo”属性值的变化。第二步是将更改复制到创建的每个动态元素。

<dom-module id="main-context">
  <template>
    <one-element foo="{{foo}}"></one-element>
    <div id="dynamic">
    </div>
  </template>
</dom-module>
<script>
Polymer({
  is: "main-context",
  // Properties used to make the link between the foo property and the dynamic elements.
  properties: {
    foo: {
      type: String,
      observer: 'fooChanged'
    },
    dynamicElements: {
      type: Array,
      value: []
    }
  },
  ready: function() {
    // injecting component into polymer and binding foo via PathObserver
    var el = document.createElement("another-element");
    // Keeps a reference to the elements dynamically created
    this.dynamicElements.push(el);
    this.$.dynamic.appendChild(el);
  },
  // Propagates the "foo" property value changes
  fooChanged: function(newValue) {
    this.dynamicElements.forEach(function(el) {
      el.foo = newValue;
    });
  }
});
</script>

查看完整的 Plunkr 示例:http ://plnkr.co/edit/TSqcikNH5bpPk9AQufez

于 2015-06-03T12:28:28.580 回答