问题: Elements 将整个 Angular 打包,并将其作为单个 JS 文件输出。当其中两个在一个页面上运行时,会发生一些可怕而奇怪的冲突,这些冲突可能会也可能不会影响您的元素的行为方式(很可能会)。
解决方案:我能够让 2 个角度元素在单个页面上完美工作的唯一方法是将它们组合到一个应用程序中。它们仍然是独立的元素,这意味着您可以在页面上的任何位置独立地包含这些自定义标签。
您仍然可以按照步骤构建自定义元素,但在您的app.module.ts
文件中添加您想要定义的任何其他元素:
ngDoBootstrap() {
const ele1= createCustomElement(ComponentOne, { injector: this.injector });
customElements.define('my-ele-one', ele1);
const ele2= createCustomElement(ComponentTwo, { injector: this.injector });
customElements.define('my-ele-two', ele2);
const ele3= createCustomElement(ComponentThree, { injector: this.injector });
customElements.define('my-ele-three', ele3);
....
}
你的 HTML 可能看起来像
<h1> My Elements </h1>
<my-ele-one></my-ele-one>
<p>What a cool element!</p>
<my-ele-two></my-ele-two>
<div class='turtle'>
<p><my-ele-three></my-ele-three></p>
</div>
这甚至可以减少您的整体页面开销,因为现在您不会有两个完整的应用程序被拉入。
我可能花了 50 多个小时试图配置两个单独的 Angular Elements 应用程序以协同工作,但无济于事。我确实需要支持所有浏览器,这绝对是一个重要因素,因为我可以让某些配置在 Chrome 或 IE 中运行,但不能同时在两者中运行。我的元素也不是简单的元素,它们有很多工作部分(引导模式、ag-grids 等)。希望这对将来的某人有所帮助。