我正在尝试构建呈现JSON对象集合的通用Web组件,如树视图和多列表视图(在两个列表之间移动项目)。我想复制iron-list使用的模式,其中包含单个项目演示文稿的模板被传递到组件以供重用。聚合物2动态合并模板
例如,假设该Web组件的模板:
<dom-module id="intworkspace-tree">
<template>
<style include="iron-flex iron-flex-alignment">
paper-icon-item {
--paper-item-min-height: var(--intworkspace-tree-margin,30px);
--paper-item-icon-width : var(--intworkspace-tree-margin,30px);
}
paper-icon-item:focus::before,
paper-icon-item:focus::after {
color: inherit;
opacity: 0;
}
.node {
margin-left: var(--intworkspace-tree-margin,30px);;
}
</style>
<slot id="labelView"></slot>
<template id="nodeView">
<div class="layout vertical">
<paper-icon-item on-tap="nodeSelected">
<iron-icon icon="expand-less" slot="item-icon" hidden$="[[!hasNodes(node)]]"></iron-icon>
<!-- label goes here-->
</paper-icon-item>
<iron-collapse class="node" opened hidden$="[[!hasNodes(node)]]">
<intworkspace-tree tree="[[node.nodes]]" embedded></intworkspace-tree>
</iron-collapse>
</div>
</template>
</template>
\t ...
</dom-module>
这种用法:
<intworkspace-tree tree="{{testTree}}">
<template><paper-item-body>[[node.name]]</paper-item-body> </template>
</intworkspace-tree>
利用Polymer.Templatize.templatize API来加载模板,创建/邮票新实例,并使用DOM API一起追加它们并将它们添加到Web组件的影子DOM。
访问模板内容,将它们组合在一起,创建并导入新模板,然后根据需要克隆它。
在经历了很多逆境之后,我成功地实现了#1而不是#2,这是我的问题的动机。 #2更吸引我,因为我一次合并模板比合并它们生成的加盖实例更容易,这种方法似乎是我可以重复使用像dom-repeat这样的嵌套模板的唯一方法。
我的主要障碍是,一旦聚合物或可能是polyfill加载模板变得不透明,只能通过聚合物templatize功能使用。例如,该代码工作正常,没有任何进口聚合物:
<template>
<div>Template Contents</div>
</template>
<div>
Template Test
</div>
<script>
let template = document.querySelector("template");
let clone = document.importNode(template.content,true);
document.querySelector("div").appendChild(clone);
</script>
聚合物外template.content DOMFragment有儿童和innerHTML的设置。但是,一旦使用聚合物,template.content就没有孩子,innerHTML也是空的。这使我从使用DOM API来创建混合可用模板一起新的模板,即
let newTemplate = document.createElement("template");
newTemplate.content = ... // combine #labelView > template.content with #nodeView.content
let nodeView = document.importNode(newTemplate.content,true);
nodeView.tree=...
也许通过使用标准的HTML机制,我没有工作,设计导入模板。有没有另一种方法来在运行时用Polymer动态创建/合并模板?我的主要动机是,我想重新使用嵌套在模板中的dom-if和dom-repeat Web组件,而不必重新实现其所有功能。