【问题标题】:Inheriting from Parent Polymer Elements (Polymer 1.0)从父聚合物元素继承 (Polymer 1.0)
【发布时间】:2015-11-06 15:32:50
【问题描述】:

我正在使用 Polymer 1.0。我有一个 Polymer dom 模块:

<parent-node></parent-node>

我正在用我自己的另一个单独的 Polymer dom-module 填充节点:

<parent-node>
  <child-node></child-node>
</parent-node>

现在我想在父节点上设置一个布尔属性,可以使子节点读取并做出反应。但是由于 Polymer 元素首先从子节点渲染到最后父节点,子节点是否可以从父节点读取它的布尔值 dark 设置为 true?:

<parent-node dark>
  <child-node></child-node> <!-- Can it read from the parent? -->
</parent-node>

我希望使用 {{dark}} 绑定的方式。父母可以发布给孩子吗?

我认为可以实现此目的的另一种方法可能是通过&lt;child-node&gt; dom-module 模板中的CSS。 :host 很棒,但我有办法打到:hostparent 吗?所以它可能类似于(伪代码):

:parent[dark] :host {
   background: #000;      
}

或者,&lt;parent-node&gt; 中可能有一种方法可以攻击&lt;content&gt;&lt;/content&gt; 的特定子代。也许 Polymer 允许穿透&lt;content&gt; 的容器以命中特定的类或 id?

有人可以帮忙吗?我当前的实现需要父级为子级分配布尔属性,但我觉得这完全违背了 Polymer 的模板和绑定能力的优势......

【问题讨论】:

    标签: html polymer web-component polymer-1.0 shadow-dom


    【解决方案1】:

    在每个上创建一个布尔属性并绑定它们应该没有任何问题。例如:

    <parent-node dark="{{darkValue}}>
      <child-node dark="{{darkValue}}"/>
      <div>{{darkValue}}</div>
    <parent-node>
    

    如果“dark”属性的通知标志设置为 true,那么这将是一种双向绑定 - 更改其中任何一个都会通知另一个。

    这里有两个元素可供试验。在其中一个中激活计时器,然后按预期在父级和子级中切换暗值。

    Polymer({
      is: 'parent-node',
    
      properties: {
        dark: {
          type: Boolean,
          notify: true,
          observer: 'log'
        }
      },
    
      ready: function() {
        var me = this;
        // ACTIVATE THIS TIMER, OR THE CHILD TIMER
        //setInterval(function() {me.dark = !me.dark}, 2000);
      },
    
      log: function (newVal, oldVal) {
        console.log('parent', newVal);
      }
    });
    
    Polymer({
      is: 'child-node',
    
      properties: {
        dark: {
          type: Boolean,
          notify: true,
          observer: 'log'
        }
      },
    
      ready: function() {
        var me = this;
        // ACTIVATE THIS TIMER, OR THE PARENT TIMER
        setInterval(function() {me.dark = !me.dark}, 2000);
      },
    
      log: function (newVal, oldVal) {
        console.log('child', newVal);
      }
    });
    

    我认为没有任何简单的方法可以通过绑定到单个父属性来通知特定子级。为此,您可能需要使用 dom 查询来访问您感兴趣的孩子并直接调用它们(即直接设置它们的暗属性)。

    编辑:内容绑定。

    这也有效:

    <dom-module id="parent-node">
      <style>
        :host {
          display: block;
        }
      </style>
    
      <template>
        <content></content>
      </template>
    </dom-module>
    

    ... 并将以下内容添加到您的 html 中:

       <parent-node dark="{{darkValue}}">
              <div>dark value of content in parent-node is <span>{{darkValue}}</span></div>
       </parent-node>
    

    父节点内容中的 {{darkValue}} 最初是空白的,但随后每次父节点切换暗值时都会更新。因此,darkValue 似乎绑定到父节点内容。

    【讨论】:

    • 感谢您的回答,但有一些问题/问题。为了让父级和子级都获得darkValue 的值,它们还必须被包裹在一个Polymer 元素内。但是如果&lt;parent-node&gt;&lt;child-node&gt; 在light DOM 中,模板不是不能工作吗?我试图看看是否有办法,一旦在阴暗的 DOM 中,将这个值传递给 content 孩子......
    • 你能把应用程序的整个顶层包装在
    • 我现在明白你要做什么了。我会用一些我设法开始工作的东西来编辑我的答案,我认为这就是你的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多