Angular, невозможно найти корневого родителя по его интерфейсу класса

Из угловой документации здесь я создал родительский класс, используя

      export abstract class Parent {}

Внутри AlexComponent я предоставил этот компонент в качестве родителя его дочерним элементам.

      providers: [{ provide: Parent, useExisting: forwardRef(() => AlexComponent) }]

Я могу получить доступ к родителю внутри дочернего компонента, используя

      export class CarolComponent {
   name = 'Carol';
   constructor( @Optional() public parent?: Parent ) { }
}

Но я не могу получить доступ к родителю внутри вложенных дочерних компонентов. Это означает, что родительский провайдер дает непосредственный родитель, но я хочу получить доступ к корневому родителю.

Например, на этом снимке экрана

Я хочу, чтобы компонент Chris имел доступ к компоненту Alice (корневой родитель, но не непосредственный родитель)

Есть ли способ получить доступ к корневому родителю?

2 ответа

Я создал пример в stackblitz, и он работает. Я не знаю, хочешь ли ты этого. Дочерний компонентChrisдоступ к корневому родителюAliceвведениеParentсорт.

https://stackblitz.com/edit/angular-accessing-root-parent

Компоненты создаются и внедряются в ваше приложение через инжектор Angular.

Каждый оформленный элемент Angular (@Component, @Service, ...) получает токен внедрения, соответствующий самому классу, который затем помещается в weakMap.

Это означает, что каждый элемент Angular должен быть внедрен в другой элемент и должен использоваться этим элементом, при условии, что они находятся в одном инжекторе и что они внедряются и используются в правильном порядке.

Что здесь происходит для вас, так это то, что вы, вероятно, расширяете класс Parent в компоненте Алисы, а также в «синих» классах. Так как weakMap полагается на метаданные класса, он, вероятно, стирает компонент Alice из weakMap, чтобы заменить его вашим синим классом.

Чтобы решить эту проблему, попробуйте не расширять родительский класс и ссылаться непосредственно на свои классы, а не на абстрактный класс. Посмотрите, работает ли это.

Другие вопросы по тегам