在附上,`this。$`一个空对象

时间:2016-12-11 19:47:40

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

我试图观察添加和删除的dom节点到我的自定义Polymer元素而没有成功。我注意到public class app{ int status=0; public static void main(String[] args) throws InterruptedException{ app obj = new app(); Thread t1 = new Thread(new print(obj,0)); Thread t2 = new Thread(new print(obj,1)); Thread t3 = new Thread(new print(obj,2)); t1.start();t2.start();t3.start(); } } class print implements Runnable{ app obj; int a; public print(app obj, int a) { this.obj=obj; this.a=a; } @Override public void run() { try{ if(a==0){ synchronized(obj){ for (int i = 0; i < 21; i++) { while(obj.status!=0 && obj.status!=3){ obj.wait(); } System.out.print(0); if(obj.status==0)//even sets status to 0 so next one is odd obj.status=1; else//odd sets status to 3 so next one is even obj.status=2; obj.notifyAll(); } } } else if(a%2!=0){ synchronized (obj) { for (int i = 0; i < 11; i++) { while(obj.status!=1){ obj.wait(); } System.out.print(a); a+=2; obj.status=3; //3 decides 0 came after odd, so next one //after zero is even obj.notifyAll(); } } } else{ synchronized (obj) { for (int i = 0; i < 11; i++) { while(obj.status!=2){ obj.wait(); } System.out.print(a); a+=2; obj.status=0; obj.notifyAll(); } } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 是一个空对象。

this.$

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

console output

我正在关注文档here

1 个答案:

答案 0 :(得分:1)

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

因此,要使this.$.contentNode存在,您需要id="contentNode"的{​​{1}}中包含<dom-module>的元素,且不得位于<template>内}或dom-if模板:

dom-repeat

必须使用<dom-module id="x-foo"> <template> <content id="contentNode"></content> </template> </dom-module> (例如dom-if)查询动态创建的节点(即dom-repeatthis.$$()内的节点)。如果您尝试在this.$$('#contentNode')回调中设置它们,则需要等到之后标记节点,这可以通过attached来观察。< / p>

Polymer.RenderStatus.afterNextRender()

要触发节点观察者,请使用Polymer's DOM API,如下所示:

<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>

codepen

UPDATE 您似乎正在将Polymer与Elm集成,并期望看到节点更改的观察者回调使我的Elm。你需要以某种方式将Elm的调用挂钩到Polymer.dom(this).appendChild(node); Polymer.dom(this).removeChild(node); / appendChild,以便它使用Polymer的DOM API。