【发布时间】:2019-03-18 17:00:19
【问题描述】:
我正在为我的 Web 组件实现 Orchestrator 模式,如下所示:
<body>
<my-controller>
<div>
<my-list>
<span>
<my-item></my-item>
</span>
</my-list>
</div>
</my-controller>
</body>
我创建的所有自定义元素都使用了 const root = super.attachShadow({mode: "open"}); root.appendChild(...); 的 Shadow DOM。
从我的内部 Web 组件中,我想在 connectedCallback() 中访问我的 my-controller 组件:
public connectedCallback(): void
{
if (this.isConnected)
{
for (let node = this.parentElement; node; node = node.parentElement)
if (node instanceof ContainerBase)
{
this._service = (<ContainerBase>node).GetService(this);
break;
}
if (this._service) this.Reset();
else throw new ReferenceError(`${this.nodeName.toLowerCase()}: Couldn't find host element while connecting to document.`);
}
}
奇怪的是:我只能到达直接的父网页控件。
所以,如果在<my-list> 上调用connectedCallback(),我可以到达<my-controller>,但如果在<my-item> 上调用connectedCallback(),我只能到达<span>。当我使用<my-item> 开始搜索时,我什至无法到达<my-list>。
即使我在调用 connectedCallback() 之后遍历 DOM 树,当我从 <my-item> 开始时,我也无法超越 <span>。
这是故意的吗?
为什么可以从第一个嵌套组件访问外部 Web 组件,而我不能从第二个嵌套组件访问第一个嵌套 Web 组件?
如何从任何嵌套级别完全向上爬上 DOM 树?
【问题讨论】:
-
可能是因为你使用了shadow dom?否则它会起作用。
-
AFAIK,Web 组件应始终使用 Shadow DOM。尴尬的是:
node.shadowRoot是null,而node.parentElement是null对于内部 Web 组件 - 并且对于 inner Web 组件仅。最外层的两个 Web 组件的行为符合预期。
标签: javascript google-chrome web-component shadow-dom custom-element