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
сорт.
Компоненты создаются и внедряются в ваше приложение через инжектор Angular.
Каждый оформленный элемент Angular (@Component, @Service, ...) получает токен внедрения, соответствующий самому классу, который затем помещается в weakMap.
Это означает, что каждый элемент Angular должен быть внедрен в другой элемент и должен использоваться этим элементом, при условии, что они находятся в одном инжекторе и что они внедряются и используются в правильном порядке.
Что здесь происходит для вас, так это то, что вы, вероятно, расширяете класс Parent в компоненте Алисы, а также в «синих» классах. Так как weakMap полагается на метаданные класса, он, вероятно, стирает компонент Alice из weakMap, чтобы заменить его вашим синим классом.
Чтобы решить эту проблему, попробуйте не расширять родительский класс и ссылаться непосредственно на свои классы, а не на абстрактный класс. Посмотрите, работает ли это.