如何将 Polymer 组件的未知子项传递到组件的 DOM

How to pass unknown children of Polymer component into component's DOM

我想创建一个组件,我可以将其他组件传递给它并创建 DOM 结构。

<test-component>
    <img/>
    <div/>
    <foo/>
</test-component>

在努力让它发挥作用:

<dom-module name="test-component">
    <template>
        <h1>Title</h1>
        <ul>
            <template is="dom-repeat" items="{{nodes}}">
                <li>element:</li>
                <li>{{item}}</li>
            </template>
        </ul>

        <content id="contentelement"></content>
    </template>
</dom-module>

<script type="text/javascript">
    Polymer({
        is: "test-component",
        ready: function() {
            this.nodes = (function(that) {
                var nodeList = that.$.contentelement._distributedNodes,
                    nodeMap = [];
                for(var i = 0; i < nodeList.length; i++) {
                    if(nodeList[i].nodeType === 1) {
                        nodeMap.push(nodeList[i].outerHTML);
                    }
                }
                return nodeMap
            }(this));
        }
    });
</script>

我使用了一个函数来构建 this.nodes 因为 this.nodes = this.$.contentelement.getDistributedNodes(); returns 空,不知道为什么。

我知道您不能只将元素的 outerHTML 放入页面中,但是可以将一组随机的 HTML/components 传递到这样的模板中吗?

不幸的是,目前无法通过数据绑定实现这一点(请查看此 discussion on Github)。

JavaScript 中有一个可能的解决方法。

<dom-module name="test-component">
    <template>
        <h1>Title</h1>
        <ul>
            <template is="dom-repeat" items="{{nodes}}">
                <li>element:</li>
                <li class="content"></li>
            </template>
        </ul>
        <content id="contentelement"></content>
    </template>
</dom-module>

<script type="text/javascript">
    Polymer({
        is: "test-component",
        ready: function() {
            this.nodes = this.getContentChildren();
            this.async(function(){
                var contentNodes = Polymer.dom(this.root).querySelectorAll(".content");
                this.nodes.forEach(function(element, index) {
                    contentNodes[index].innerHTML = element.outerHTML;
                });
            }.bind(this));
        }
    });
</script>

编辑

您可以通过从 DOM.

中移除内容节点,从而在您访问内容节点后将它们从它们的原始位置移除。
this.nodes = this.getContentChildren();
Polymer.dom(this.root).removeChild(this.$.contentelement);