这是我的解决方案,它基于Jeff Posnick的解决方案,但采用了Scott Miles的建议来监听添加和删除事件。
<polymer-element name="baby-element" attributes="name">
<template>
<p>{{name}}: <content></content> <input type="button" value="Kill Baby" on-click="{{killBaby}}"/></p>
</template>
<script>
Polymer("baby-element", {
attached: function(){
this.fire('baby-added');
},
killBaby: function(){
this.fire('baby-removed');
},
detached: function() {
this.fire('baby-removed');
}
});
</script>
</polymer-element>
<polymer-element name="parent-element" attributes="name">
<template>
<p>{{name}} has {{count}} babys, {{babys}}:</p>
<p><content id="content"></content></p>
</template>
<script>
Polymer({
count: 0,
babys: '',
domReady: function() {
this.recalcBabys();
this.addEventListener('baby-added', this.babyAdded);
this.addEventListener('baby-removed', this.babyRemoved);
},
babyRemoved: function(e) {
e.target.remove();
this.recalcBabys();
},
babyAdded: function(e) {
this.recalcBabys();
},
recalcBabys: function(){
var names = [].map.call(this.children, function(babyElement) {
return babyElement.name;
});
this.count = names.length;
this.babys = names.join(' and ');
}
});
</script>
</polymer-element>
<h1>It's aparent baby thing:</h1>
<input type=button value="make baby" id="makeBaby"></input>
<input type=input placeholder="baby name" id="babyName"></input>
<input type=input placeholder="baby info" id="babyInfo"></input>
<parent-element id="parent" name="Slim Sim">
<baby-element name="Curie">has X</baby-element>
<baby-element name="Korbut">volts like no other!</baby-element>
<baby-element name="Pavlov">has dogs!</baby-element>
<baby-element name="Schrodinger">... maybe has a cat?</baby-element>
</parent-element>
<script>
document.getElementById('makeBaby').addEventListener('click', function(){
var name = document.getElementById('babyName');
var info = document.getElementById('babyInfo');
var parent = document.getElementById('parent');
var baby = document.createElement("baby-element");
var inner = document.createTextNode(info.value);
baby.appendChild(inner);
baby.setAttribute("name",name.value);
parent.appendChild(baby);
});
</script>
我无法通过例如document.getElementsByTagName('baby-element')[0].remove()
从外部删除婴儿时,使父元素重新计算Babys。
我希望(在baby-element上)仅触发附加和分离方法的baby-added和baby-removed事件,并且killBaby函数仅执行'this.remove()'。但是我无法让父级听到所有这些事件...
请随意审查此代码并告诉我任何错误,我有点新于Polymer,但我仍然希望能够做出贡献!
this.children
有两个限制性:(1)如果元素通过<content>
进行投射,它们将不会出现在children
中; (2)子元素可能会出现和消失。尽可能明确地握手关系。例如,当<son-element>
被attached()
时触发son-added
事件,当detached()
时触发son-removed
事件。father-element
可以监听这些事件并直接管理这些关系。 - Scott Miles