Failed 🔬🧪 Angular service for on-demand loading modules - #34852
Conversation
|
🤖 Thank you for contributing to CiviCRM! ❤️ We will need to test and review this PR. 👷 Introduction for new contributors...
Quick links for reviewers...
|
|
Hmm. I was thinking an approach could be to add the required subsearch modules to the dependency graph in advance. Something like:
It will only work where the search is being used embedded in an afform type module though? 🤔 How is the necessary module for the search display loaded when a search display isn't inside an afform? |
Manually. But I ended up deciding not to fight against AngularJS here: it really wants all modules up-front, and this gives it what it wants. The performance cost is probably negligible and not worth spending more time on, since our real objective is to move toward WebComponents and we're already building a much better lazy loader for those. |
Overview
Just thought I'd leave this here for posterity. Is it possible to lazy-load AngularJS modules on-demand? The short answer is "no".
The use-case was subsearches. Where e.g. we have a
crm-search-display-tablewith a subsearch of a different type, saycrm-search-display-listembedded in it. IfcrmSearchDisplayListmodule wasn't present at page-load, this code would helpfully load it for us.It doesn't work.
In some circumstances, it is possible to lazy-load modules. In fact we already do it when we popup a new Afform. The Afform itself is a new AgularJS module that wasn't necessarily present when the page first loaded. This PR was piggybacking on that mechanism.
But the reason the popup scenario works and this one doesn't is because we bootstrap a new instance of Angular within the popup, and it initializes its compiler with all available modules (including the one we just loaded). However, any existing
<crm-angular-js>blocks on the page with Angular already bootstrapped will not get the new module, because their compiler has already set up its injector with the old list of modules.And there's not much to be done about that without ripping into the guts of AngularJS's
$compiler/injector. Not worth it IMO.