¿Cómo agregar dinámicamente una directiva?

¿Cómo agregar ( inyectar ) dinámicamente una directiva en el host?

Tengo una directiva myTooltip y me gustaría agregar la directiva mdTooltip a su host. He intentado setAttribute() de ElementRef.nativeElement , pero no crea la directiva mdTooltip.

mytooltip.directive.ts:

 @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) */ } } 

Por host me refiero al elemento que tiene la directiva myTooltip:

 Click here 

El resultado no cambiaría por encima de html, pero en mouseenter tendría la directiva md-tooltip en span.

Por cierto, la razón por la que estoy usando un wrapper y no directamente md-tooltip es que deseo modificar el retraso de la presentación, el retraso de la ocultación y personalizar el comportamiento de la información sobre herramientas materiales por otros medios.

Editar Aparentemente, agregar directivas de forma dinámica no es compatible actualmente 🙁 Creo que esta pregunta aún debería estar aquí en caso de que el equipo material actualice esa versión.

Esa es una característica que estamos pidiendo en angular … lea esto: https://github.com/angular/angular/issues/8785

Una manera rápida y sucia de hacerlo es usar:

Tengo una directiva que creé llamada myHilite para resaltar el texto

En mi archivo Component.ts , agrego esto …

@HostBinding('attr.myHilite') myHilite = new myHilite();

o si tu directivo tiene parámetros …

@HostBinding('attr.myHilite') myHilite = new myHilite(this.elementRef);

Si su directiva necesita ejecutar código en uno de los enganches de ciclo de vida, necesita llamar manualmente el método de enganche del ciclo de vida de las directivas en los métodos de enganche de ciclo de vida del componente padre como este …

Component.ts

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