Как получить доступ к компоненту host из директивы?
скажем, у меня есть следующие разметки:
<my-comp myDirective></my-comp>
есть ли способ получить доступ к экземпляру компонента из директивы?
более конкретно, я хочу иметь доступ к свойствам и методам MyComponent
С MyDirective
в идеале ничего не добавляя в HTML выше.
4 ответов
вы можете просто ввести его
class MyDirective {
constructor(private host:MyComponent) {}
серьезным ограничением является то, что вам нужно знать тип компонента заранее.
Смотрите также https://github.com/angular/angular/issues/8277
Она также предоставляет некоторые обходные пути, когда вы не знаете тип заранее.
это взято из проблемы github и работает как шарм. Недостатком является необходимость знать компоненты заранее, но в вашем случае вам все равно нужно знать методы, которые вы используете.
import { Host, Self, Optional } from '@angular/core';
constructor(
@Host() @Self() @Optional() public hostCheckboxComponent : MdlCheckboxComponent
,@Host() @Self() @Optional() public hostSliderComponent : MdlSliderComponent){
if(this.hostCheckboxComponent) {
console.log("host is a checkbox");
} else if(this.hostSliderComponent) {
console.log("host is a slider");
}
}
кредит: https://github.com/angular/angular/issues/8277#issuecomment-323678013
поручение может быть универсальной, которая может быть применена к любому из компонентов. Таким образом, в этом случае инъекция компонента в конструктор невозможна, поэтому вот еще один способ сделать то же самое
ввести ViewContainerRef
в конструктор
constructor(private _viewContainerRef: ViewContainerRef) { }
а затем получить его с помощью
let hostComponent = this._viewContainerRef["_data"].componentView.component;
constructor(private vcRef: ViewContainerRef){
let parentComponent=(<any>this.vcRef)._view.context;
}