【问题标题】:On attached, `this.$` an empty object附加时,`this.$` 是一个空对象
【发布时间】:2017-04-26 16:51:34
【问题描述】:

我正在尝试观察添加和删除的 dom 节点到我的自定义 Polymer 元素,但没有成功。我注意到this.$ 是一个空对象。

  Polymer({
    is: 'dramatic-view',
    attached: function () {
      this._observer = Polymer.dom(this.$.contentNode).observeNodes(function (info) {
        console.log('kromid info', info);
      });
    }
  });

回调只被调用一次(即使我之后更改了内容),带有以下奇怪的参数:

我正在关注文档here

【问题讨论】:

    标签: polymer polymer-1.0 web-component custom-element


    【解决方案1】:

    this.$ 是模板中具有id 属性的元素的哈希值(请参阅Automatic node finding)。

    因此,要使this.$.contentNode 存在,您需要在<dom-module><template> 中有一个带有id="contentNode" 的元素,并且它不能在dom-ifdom-repeat 模板中:

    <dom-module id="x-foo">
      <template>
        <content id="contentNode"></content>
      </template>
    </dom-module>
    

    动态创建的节点(即dom-ifdom-repeat 内的节点)必须使用this.$$()(例如this.$$('#contentNode'))进行查询。如果您尝试在attached 回调中设置它们,则需要等到节点被标记后,这可以通过Polymer.RenderStatus.afterNextRender() 观察到。

    <dom-module id="x-foo">
      <template>
        <template is="dom-if" if="[[useDynamicContent]]">
          <content id="contentNode"></content> <!-- unavailable to this.$ -->
        </template>
      </template>
      <script>
        Polymer({
          is: 'x-foo',
          attached: function() {
            Polymer.RenderStatus.afterNextRender(this, function() {
              var contentNode = this.$$('#contentNode');
              if (contentNode) {
                contentNode.observeNodes(...);
              }
            });
          }
        });
      </script>
    </dom-module>
    

    要触发节点观察者,请像这样使用Polymer's DOM API

    Polymer.dom(this).appendChild(node);
    Polymer.dom(this).removeChild(node);
    

    codepen

    更新 看来您正在将 Polymer 与 Elm 集成,并期望看到节点更改的观察者回调使我的 Elm。您需要以某种方式将 Elm 的调用与 appendChild/removeChild 挂钩,以便它使用 Polymer 的 DOM API。

    【讨论】:

    • 我感觉我们已经接近了。添加id 修复了空对象,现在&lt;content&gt; 就在那里。但是,当我更改内容时,回调没有运行。
    • 你是如何改变内容的?
    • 这是在Elm virtual-dom 中完成的,我猜它正在调用appendChild
    • 查看 Codepen 演示的更新答案。不确定是否可行,但您需要将 Elm 的调用与 appendChild/removeChild 挂钩,以便它使用 Polymer 的 DOM API。
    • 什么什么?这不是原生元素功能吗?或者观察孩子这只是一个 Polymer api?无法更改 Elm 虚拟域。它是编译器的一部分。
    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2016-06-18
    • 2013-06-05
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多