我想使用dom-repeat
在<li>
标签中包装一堆子节点。问题是,我想重复的节点本身就是自定义元素,通过插槽插入,看来dom-repeat只接受通过属性传递的数据。
我想做的是:
<dom-module id="my-custom-element">
<template>
<section>
...
<ul>
<dom-repeat items="{{ TOP-LEVEL NODES IN LIST SLOT }}">
<template>
<li>{{ item }}</li>
</template>
</dom-repeat>
</ul>
</section>
</template>
</dom-module>
并使用它:
<my-custom-element>
<ul slot="LIST">
<my-other-custom-element></my-other-custom-element>
<my-other-custom-element></my-other-custom-element>
<my-other-custom-element></my-other-custom-element>
</ul>
</my-custom-element>
最佳答案
我不认为这是最好的Polymer方法,但是它可以工作:
<x-foo>
<ul slot="list">
<div> hi </div>
<div> hello </div>
<div> bye </div>
</ul>
</x-foo>
<dom-module id="x-foo">
<template>
<h2> The raw slotted items </h2>
<slot name="list" id="list"></slot>
<h2> The slotted list items wrapped with 'li' </h2>
<ul id="styledList"></ul>
</template>
</dom-module>
这是窍门:
class XFoo extends Polymer.Element {
static get is() { return 'x-foo'; }
static get properties() {
return {
items: {
type: Array,
value: function() {
return [1, 2, 3, 4]
}
}
};
}
connectedCallback() {
super.connectedCallback();
this.$.list.addEventListener('slotchange', (e) => this.bindSlottedItems() );
}
bindSlottedItems() {
let items = this.$.list.assignedNodes({flatten: true})[0].childNodes;
items = [].slice.call(items)
this.$.styledList.innerHTML = items.filter((item) => item.outerHTML).map((item) => {
return `<li> ${item.outerHTML} </li>`
}).join('');
}
}
customElements.define(XFoo.is, XFoo);
https://codepen.io/MWalid/pen/aGJRWy
关于polymer - 我可以在广告位内容上使用dom-repeat来将每个广告位子级包装在某个标签内吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50086758/