我尝试创建一个具有动态数量的标签的元素,具体取决于为元素指定的内容。我已经知道如何做到这一点的唯一方法是JS,但我感觉这不是Polymer方式,我错过了什么?你能指点一些有助于我入门的文档或其他元素吗?
这是我到目前为止所拥有的:
使用我的自定义元素
<code-file-set>
<a href="#" tabTitle="onelink">onelink</a>
<a href="#" tabTitle="twolink">twolink</a>
<a href="#" tabTitle="threelink">threelink</a>
</code-file-set>
我的自定义元素的实现
<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="/bower_components/core-pages/core-pages.html">
<link rel="import" href="/bower_components/paper-tabs/paper-tabs.html">
<polymer-element name="code-file-set">
<template>
<paper-tabs id="tabs" selected={{selected}}>
</paper-tabs>
<core-pages selected="{{selected}}">
<content id="codecontent" select="a"></content>
</core-pages>
</template>
<script>
Polymer('code-file-set', {
domReady: function() {
var codeNodes = this.$.codecontent.getDistributedNodes();
for (var i = 0; i < codeNodes.length; i++) {
var name = codeNodes[i].getAttribute('tabTitle');
var tab = document.createElement('paper-tab');
tab.innerHTML = name;
this.$.tabs.appendChild(tab);
}
this.selected = 0;
},
});
</script>
</polymer-element>
这有效,但看起来很难看。也就是说,可以创建选项卡不是在JS中完成,而是在HTML中以更具说明性的方式完成(请注意,我在内容中找到每个元素创建一个选项卡)。
答案 0 :(得分:3)
我想添加一个答案,因为即使已经接受了一个答案,因为您不仅限于使用数据绑定。在许多情况下,可能优选使用内容。它的工作量稍微多一些,但如果您愿意,它可以让您在其中组合其他元素。
如果您使用<content>
元素,则可以使用getDistributedNodes()
获取分发的子级。如果向select
元素添加<content>
属性,它将忽略文本节点并仅创建所需元素的NodeList。例如:<content select="a">
。然后创建一个内部变量来指向这些子项,并使用模板repeat和该变量。
代码示例:
<polymer-element name="x-menu">
<template>
<style>
::content > * {
display: none;
}
</style>
<content id="content" select="a"></content>
<paper-tabs link>
<template repeat="{{tab in tabs}}">
<paper-tab>
<a href="{{tab.href}}" horizontal center-center layout>
{{tab.textContent}}
</a>
</paper-tab>
</template>
</paper-tabs>
</template>
<script>
Polymer({
domReady: function() {
this.tabs = this.$.content.getDistributedNodes().array();
}
});
</script>
</polymer-element>
<x-menu>
<a href="#foo">Foo</a>
<a href="#bar">Bar</a>
<a href="#baz">Baz</a>
</x-menu>
示例jsbin:http://jsbin.com/duzapu/6/edit
有一点需要注意,如果您希望孩子的数量在任何时候发生变化,您应该使用onMutation注意这一点,并相应地更新您的内部变量。
答案 1 :(得分:2)
正确的数据绑定解决方案是将数组(tabs
)定义为published property并使用template repeat
迭代数组并将每个项目填充到UI上。
<polymer-element name="code-file-set" attributes="tabs">
<template>
<paper-tabs style="background-color:limegreen" selected="0">
<template repeat="{{tab in tabs}}">
<paper-tab>
<a href="{{tab.link}}">{{tab.tabTitle}}</a>
</paper-tab>
</template>
</paper-tabs>
</template>
<script>
Polymer('code-file-set', {
ready: function () {
this.tabs = [];
for (var i = 0; i <= 3; i++) {
this.tabs.push({ link: '#', tabTitle: 'title ' + i });
}
},
});
</script>
</polymer-element>
请参阅此jsbin作为工作示例。