【发布时间】:2017-07-12 19:26:23
【问题描述】:
背景:这个问题与 Chrome 最新版本的扩展开发有关。它依赖于 javascript 功能,例如 HTML 导入和自定义元素,这些功能并非在所有浏览器上都可用,但在这种情况下是可以的。
我正在尝试实现一个简化如下的 HTML 自定义元素:
<custom-el>
<span slot="head">Great</span>
<span slot="item">Item one</span>
<span slot="item">Item two</span>
<span slot="foot">done</span>
</custom-el>
我注册了<custom-el>。每次创建元素时,我的代码的自定义元素类都会附加一个影子根并附加到来自以下模板的影子根内容:
<template id="main">
<h1><slot name="head"></slot></h1>
<ul>
<slot name="item"></slot>
</ul>
<i><slot name="foot"></slot></i>
</template>
我想将每个带有slot="item" 属性的<span> 重新分配到负责呈现单个项目的辅助模板:
<template id="sub">
<li><slot name="item"></slot></li>
</template>
属性为name="item" 的槽数不固定。它由数据库生成并定期更改。
我了解可以通过将 shadowRoot 附加到插槽的父元素并设置插槽的插槽属性来重新分配插槽,例如<slot name="item" slot="newItem">。但我认为这不适用于我的情况,因为子模板需要包装每个项目实例,而不是项目列表。
我可以将影子根和子模板附加到主文档中的每个项目。这会起作用,但我的偏好是主模板导入并应用任何嵌套的 shadowRoots 和模板。这样,主文档只需要导入包含主模板的文件。组件细节的实现封装在主模板html文件中。
我还可以使用slotchange 事件和HTMLSlotElement.assignedNodes 方法来拼凑一个脚本解决方案。但我宁愿不走那条路。
还有其他方法吗?我的实际用例涉及更复杂的 HTML 结构。还是我的架构或对 Web 组件的理解存在缺陷?
【问题讨论】:
-
“定期更改”是什么意思?
-
@Supersharp 响应事件/消息,我的 javascript 代码将从 Light DOM 中添加和删除
<span slot="item">元素。我希望更新之间的间隔很长(多秒)。你问的是这个吗? -
曾经想出一个好的解决方案吗?
标签: html google-chrome-extension web-component shadow-dom custom-element