Я реализую шаблон Orchestrator для своих веб-компонентов, например:
<body>
<my-controller>
<div>
<my-list>
<span>
<my-item></my-item>
</span>
</my-list>
</div>
</my-controller>
</body>
Все созданные мной пользовательские элементы используют Shadow DOM, используя const root = super.attachShadow({mode: "open"}); root.appendChild(...);
.
Из моей внутренней сети.компоненты, к которым я хочу подключиться my-controller
компонент в connectedCallback()
:
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.`);
}
}
Странная вещь: я могу связаться только с непосредственным родительским веб-контролем.
Итак, если connectedCallback()
вызывается на <my-list>
, я могу достичь <my-controller>
, но если connectedCallback()
вызывается на <my-item>
, я достигаю <span>
.Я даже не могу достичь <my-list>
, когда начинаю поиск с <my-item>
.
Даже когда я хожу по дереву DOM после вызова connectedCallback()
, я не могу выйти за пределы <span>
, когда яначать с <my-item>
.
Это намеренно?
Почему может Я получаю доступ к внешнему веб-компоненту из первого вложенного, а я не могу добраться до первого вложенного веб-компонента со второго вложенного?
Как мне полностью перейти на дерево DOM с любого вложенного уровня?