Suppose, I am making a custom Angular directive that has to examine and manipulate the DOM tree inside it (to be precise: the DOM tree under the element the directive is applied to). The right place for such manipulation is the directive's post-link function.
That works fine while all the HTML inside the directive is inlined. Problems appear when inside the directive we have other directives that load their templates using "templateUrl" property, or just "ng-include" directives to insert partials.
Those templates and partials are loaded asynchronously. That means, at the compile stage Angular will initiate the partial loading and will continue compiling without waiting for the loading to complete. Then, at the moment the parent directive is linked, the contained partials loading may still be in progress, so the directive's post-link function sees nothing inside.
In other words: the directive's post-link function is designed to have all nested DOM ready by the moment it is called, but with the async templates and includes this is not the case!
And template pre-loading does not help, because they are still accessed asynchronously.
How do people overcome that?
The task seems to be quite common, but I did not manage to find a good and reliable solution. Do I miss something obvious?...
Update: Well I have created a Plunk to illustrate the problem. Actually it reproduces only the problem with ng-include
, the external template for sub-directive works. In my project it did not though, maybe this is a race condition, I have to investigate more.