Angular 7: получить доступ к компонентным методам через маршрутизатор - PullRequest
0 голосов
/ 20 мая 2019

Заранее прошу прощения, если это дубликат чьего-то вопроса, однако я не могу найти решение своей проблемы.

Мне нужно получить доступ к методам компонента через дерево маршрутизатора. Я знаю, что обычной практикой является связывание функциональности через сервисы, но я работаю с ViewContainerRef и ElementRef, которые необходимо предоставить из компонента, к которому мне нужен доступ.

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

parent.component.ts

export class ParentComponent {

    childComponent: ChildComponent;

    constructor(
        private activatedRoute: ActivatedRoute
    ) {
        this.activatedRoute.url.subscribe(data => {
            this.childComponent = this.activatedRoute.snapshot.firstChild.component;
            this.childComponent.someMethod() // not working
        });
    }
}

child.component.ts

export class ChildComponent {

    constructor() { }

    someMethod() {
        console.log('Method Called');
    }
}

Я также пытался использовать ViewChild, но ChildComponent не является частью родителя, поэтому всегда undefined. Как я могу получить доступ к методу ChildComponent?

1 Ответ

0 голосов
/ 20 мая 2019

Я полагаю, что вы можете создать экземпляр компонента с помощью ComponentFactoryResolver (@angular/core) и вызвать его открытые методы.

export class ParentComponent {

constructor(private activatedRoute: ActivatedRoute, private resolver: ComponentFactoryResolver) {
    this.activatedRoute.url.subscribe(data => {

       const child = this.activatedRoute.snapshot.firstChild.component;

       // ... validations 

       const cfactory = this.resolver.resolveComponentFactory(<any>child);

       console.log(cfactory.componentType.prototype['someMethod']());

    });
  }
}

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

...