Как получить доступ к компоненту 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;
}