How to instantiate and apply directives programmatically?

I know that in ng2 we have ComponentFactoryResolver that can resolve factories that we can apply to a ViewContainerRef.

But, is there something similar for directives? a way to instantiate them and apply them to the projected content from a component?


Solution 1:

No, directives can't be added or removed dynamically. They are only applied to HTML statically added to component templates.

What you could do is to enable/disable the directive by passing a parameter (@Input()) to the directive to notify it to do something or not.

Solution 2:

It's not impossible. It's just ugly and error prone. Basic thing to remember is that a directive is first a class. If you can manually get your hands on the stuff the constructor needs, you can simply do something like:

const highlight = new HighlightDirective(...);

Be prepared for possibly running into unexpected behaviors as you will escape Angular's hands.

Read my full answer here on dynamically adding directives.