【发布时间】:2018-12-08 15:12:00
【问题描述】:
我创建并导出了一个 Angular 元素(Angular 中的 Web 组件)作为单个脚本标签 (user-poll.js)。 要使用这个 Angular Element,我只需要在主机站点中指定以下两行:
<user-poll></user-poll>
<script src="path/to/user-poll.js"></script>
我有以下要求:
- 在外部站点上加载多个 Angular 元素。
- 动态加载所有 Angular 元素
我有以下问题:
- 在网站上加载多个组件会导致 Angular 冲突,因为每个组件脚本本身就是一个完整的 Angular 应用程序。
- 为了解决冲突问题,我将每个组件加载到一个单独的 Shadow Dom 组件中(即在 shadow dom 容器中添加组件标记和组件脚本文件链接),以便每个组件都被沙箱化。但是 shadow dom 中的组件脚本不起作用。
shadow dom 内部动态加载组件的JSBin example
<body>
</body>
setTimeout(() => {
loadJS();
}, 2000);
function loadJS() {
var elm = document.createElement("div");
elm.attachShadow({mode: "open"});
elm.shadowRoot.innerHTML = `<user-poll><h2>Custom Web Component - user-poll loaded</h2><script src="https://cdn.rawgit.com/SaurabhLpRocks/795f67f8dc9652e5f119bd6060b58265/raw/d5490627b623f09c84cfecbd3d2bb8e09c743ed4/user-poll.js"><\/\script></user-poll>`;
document.body.appendChild(elm);
}
那么,在网站上动态加载多个 Angular 元素的最佳方式是什么?
【问题讨论】:
-
需要注意的是
elm.innerHTML没有使用ShadowDOM。为此,您需要使用elm.shadowRoot.innerHTML。 -
我的错!将示例更正为正确的 ShadowDOM。
-
加载脚本的内容也不是为使用 shadow dom 而设计的
标签: javascript angular web-component shadow-dom angular-elements