Как динамически добавить директиву?

как динамически добавить (inject) директива в хост?

у меня есть директива myTooltip, и я хотел бы добавить директиву mdTooltip к ее хосту. Я пробовал setAttribute() of ElementRef.nativeElement, но он не создает директиву mdTooltip.

mytooltip.директива.ТС:

@Directive({
  selector: '[my-tooltip]',
  host: {
    '(mouseenter)': 'show()',
    '(mouseleave)': 'hide()',
  }
})
export class myTooltip {
  @Input('my-tooltip') message;

  constructor() { }

  show() {
    /* TODO: How to add md-tooltip directive to elementref (host)? */
  }

  hide() {
    /* TODO: remove md-tooltip directive from elementref (host) */
  }
}

под хостом я подразумеваю элемент, который имеет директиву myTooltip:

<span my-tooltip="tooltip hint">Click here</span>

результат не изменится выше html, но на mouseenter это будет иметь директиву MD-tooltip в span.

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

редактировать по-видимому, динамическое добавление директив в настоящее время не поддерживается :( я думаю, что этот вопрос все еще должен быть здесь, если он обновляет команду

1 ответов


это функция, которую мы просим в angular...прочтите это: https://github.com/angular/angular/issues/8785

быстрый и грязный способ сделать это-использовать:

у меня есть директива с именем myHilite (чтобы выделить текст), у меня также есть компонент с именем MainComponent.ts. В MainComponent.ts Я добавил эту строку кода...

export class MainComponent {
    @HostBinding('attr.myHilite') myHiliteDirective = new myHilite();
} 

если ваша директива требует параметров...

export class MainComponent {
    @HostBinding('attr.myHilite') myHiliteDirective = new myHilite(this.elementRef);
}

вашей директиве может потребоваться выполнить код в одном из его крючки жизненного цикла вручную вызывают метод Lifecycle hook директивы в методе lifecycle hook родительского компонента следующим образом...

export class MainComponent {
    //...code...

    ngOnInit(){
        this.myHiliteDirective.ngOnInit();
    }
}