我试图观察添加和删除的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.$
使用以下奇怪的参数调用回调一次(即使我之后更改内容):
我正在关注文档here。
答案 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-repeat
或this.$$()
内的节点)。如果您尝试在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>
UPDATE 您似乎正在将Polymer与Elm集成,并期望看到节点更改的观察者回调使我的Elm。你需要以某种方式将Elm的调用挂钩到Polymer.dom(this).appendChild(node);
Polymer.dom(this).removeChild(node);
/ appendChild
,以便它使用Polymer的DOM API。