我正在尝试创建一个可重用的列表,将其作为一个插槽传入的行模板,但插槽内容只重复一次。示例:https://codepen.io/chris-gunawardena/project/editor/XkPYQw
<script src="https://polygit.org/components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="https://polygit.org/components/paper-button/paper-button.html">
<dom-module id="list-repeater">
<template>
<template is="dom-repeat" items="{{items}}" as="item">
<li>
# [[index]]: [[item]] <slot name="row-template"></slot>
</li>
</template>
</template>
<script>
class ListRepeater extends Polymer.Element {
static get is() {
return 'list-repeater';
}
static get properties() {
return {
items: Array,
};
}
}
customElements.define(ListRepeater.is, ListRepeater);
</script>
</dom-module>
这样使用:
<list-repeater items='["a","b"]'>
<div slot="row-template">--slot content--</div>
</list-repeater>
该功能类似于铁列表,它采用模板但很难跟踪铁列表的行为。
答案 0 :(得分:1)
使用广告位不适用于您的情况,铁列表正在使用Templatizer Behavior来实现此目标
Polymer.Templatizer 行为添加了生成模板实例的方法,每个模板都由匿名 Polymer.PropertyEffects 实例管理,其中标记模板内容中的数据绑定是绑定到自己的访问者。
答案 1 :(得分:0)
我也遇到了同样的问题,为此我找到了一个解决方案,您可以尝试一下,让我知道这是否对您有用。这种方法使用了模板器。
HTML:
<div id="you-component-list"><your-component></you-component><div>
JS:
在附加方法中,添加以下行:
attached() {
this.templatize(/** @type {!HTMLTemplateElement} **/ (
this.$.'your-component-list'.querySelector('template')));},
const /** !Array */ flattenedNodes = Polymer.FlattenedNodesObserver.getFlattenedNodes(this); const distributedNodeToAppend = /** !Node */ flattenedNodes.find( (/** !Node */ node) => (node.nodeType === Node.ELEMENT_NODE && node.hasAttribute('slot'))); const clone = this.stamp({item: item}); if (distributedNodeToAppend) { const childNode = distributedNodeToAppend.cloneNode(true); childNode.removeAttribute('slot'); clone.root.querySelector('Your-component').appendChild(childNode); } Polymer.dom(this.$.'you-component-list').appendChild(clone.root);