【问题标题】:Data-binding between nested polymer elements嵌套聚合物元素之间的数据绑定
【发布时间】:2014-05-07 15:28:56
【问题描述】:

假设我有两个不同的polymer-elements

应该使用content 占位符将一个嵌入到另一个内部。 是否可以在这两个嵌套的 polymer-elements 之间进行数据绑定?

我试过了,但我不能让它工作:http://jsbin.com/IVodePuS/11/

根据http://www.polymer-project.org/articles/communication.html#bindingpolymer-elements 之间的数据绑定应该可以工作(在这些示例中,它们是在template 标记内完成的,而不使用content 占位符)。

更新:

Scott Miles 澄清说,数据绑定仅适用于 template 级别。
但是在我的情况下,我事先不知道确切的template,但我想允许我的parent-element 的用户指定它应该包含哪个child-element(假设有不同的child-elements
我认为这个问题与这个问题有关:Using template defined in light dom inside a Polymer element

我更新了下面的例子来突出他的:

<polymer-element name="parent-element" >
  <template >
    <div>Parent data: {{data1}} </div>
    <content />
  </template>
  <script>
    Polymer('parent-element', {
      data1 : '',
      ready: function() {
        this.data='parent content';
      }
    });

  </script>
</polymer-element>

<polymer-element name="child-element" attributes="data2">
   <template>
    <div>Parent data: {{data2}} </div>
  </template>
  <script>
    Polymer('child-element', {
      data2 : '',
      ready: function() {
      }
    });
  </script>
</polymer-element>

<polymer-element name="child2-element" attributes="data2">
   <template>
    <div>Parent data: {{data2}} </div>
  </template>
  <script>
    Polymer('child2-element', {
      data2 : '',
      ready: function() {
      }
    });
  </script>
</polymer-element>

用户可以选择嵌入哪个child-element

<parent-element data1 = "test">
  <child-element data2="{{data1}}"/>
</parent-element>

<parent-element data1 ="test" >
  <child2-element data2="{{data1}}"/>
</parent-element>

解决方法:

我找到的唯一解决方法是添加change watcher并使用getDistributedNodes()获取子元素并手动将data2设置为data

<polymer-element name="parent-element" >
  <template >
    <div>Parent data: {{data}} </div>
    <content id="content"/>
  </template>
  <script>
    Polymer('parent-element', {
      data : '',
      ready: function() {
        this.data='parent content';
      },
      dataChanged : function() {
          contents = this.$.content.getDistributedNodes();
          if (contents.length > 0) {
              contents[0].data2 = this.data;
          }
      },
    });

  </script>
</polymer-element>

【问题讨论】:

  • 正是我需要做的。我今天会试试你的解决方案

标签: data-binding polymer web-component shadow-dom


【解决方案1】:

Polymer 数据绑定通过将模型附加到整个子树来工作。

你写道:

<parent-element>
  <child-element data2="{{data}}"/>
</parent-element>

这意味着 parentNode 提供绑定模型的规则。但现在想象一下你想写:

<parent-element>
  <div>
    <child-element data2="{{data}}"></child-element>
  </div>
</parent-element>

现在你有问题了。

相反,在 Polymer 示例中,您会注意到 {{}}(几乎总是)在模板内部。例如,如果我定义:

<polymer-element name="host-element" attributes="data" noscript>
<template>
  <parent-element data1="{{data}}">
    <child-element data2="{{data}}"></child-element>
  </parent-element>
</template>
</polymer-element>

现在,我有一个模型上下文 (host-element),我可以使用它来将模板描述的整个子树中的内容绑定在一起。

请注意,我不需要attributes="data" 来工作。我补充说,所以主机元素暴露data,我可以这样做:

<host-element data="test"></host-element>  

http://jsbin.com/IVodePuS/15/edit

【讨论】:

  • 次要注意,这个 jsbin 似乎只适用于 Canary。使用 polyfill,似乎主机元素的使用需要遵循其声明。
  • 元素使用永远不需要遵循声明。你在哪里测试?我在 Chrome 34、FF 29、IE 11 中对其进行了测试,它运行良好。
  • 我的错误。我的机器有些奇怪。崩溃和重启后,jsbin 在我之前运行过的 Chrome 35 上完美运行。
  • 非常感谢@ScottMiles 的反馈。但是我的具体用例是我在设计时不知道确切的模板,而只在运行时知道。想象一下,我有两个不同的child-elements,我希望我的parent-element 的用户选择应该使用child-element。我更新了问题。
  • sheesh 聚合物就是这么复杂,yuk
【解决方案2】:

像魅力一样工作。父元素发布属性数据,可以通过2路数据绑定。这样子元素就得到了相同的数据。

<polymer-element name="custom-element">
<template>
    <parent data="{{data}}">
        <child data="{{data}}"></child>
    </parent>
</template>
<script>
    Polymer({
        ready: function() {

        },
        data: {}
    });
</script>

【讨论】:

    【解决方案3】:

    我认为在 Polymer >= 1.0 中应该使用“Auto-binding template”来完成。

    【讨论】:

    • 欢迎来到 Stack Overflow!您的答案可能会受益于特定示例和有关链接的更多信息。不过,有用的提示确实可以制作出很棒的 cmets。有关一些有用的建议,请参阅 How to Answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多