Agree. It will be very helpful when loading a module asynchronously using
requireJS.
On Thursday, 24 October 2013 11:41:28 UTC+5:30, Craig Leyshan wrote:
>
> Hi Everyone. I would like to propose a change to AngularJS that would make
> life easy for those people who wish to use something like requireJS to
> dynamically load angular modules after the angular application has been
> bootstrapped. Just so people don't shoot this idea down as 'you dont need
> to do that', I'll explain my use case.
>
> Imagine a portal-like application where the user has a space where they
> can pull in tools, widgets, gadgets, portlets, doobiwhacckers (call them
> what you will). Each of these "gadgets" is a simple angular module,
> complete with template, controller, services, directives etc. Now imagine
> there are 30-50 of these available but each user only want say 2-5 on the
> screen at once. Using angular as it is today, I need to download the code
> for all 50 gadgets........... and then bootstrap angular. The majority of
> that code is not needed by the user so they are waiting longer than they
> should
>
> Now you might say - cant each gadget be its own self-contained angular app
> that is bootstrapped separately? It could. but there is lots of shared
> code between these gadgets, and also shared state (ie services) and I want
> changes in one gadget to automatically be reflected in other gadgets using
> angular binding. I also want the gadgets loosely coupled so that they dont
> need to be explicitly aware of the other gadgets - dependency injection in
> angular can take care of that for me so that each gadget has access to the
> same state.
>
> So instead of lots of little angular apps, I need one angular app where I
> will use requireJS (for example) to only download the code for the gadgets
> that this user needs right now. I can do that, for initial page load. But
> what about when the user wishes to add a gadget to the page later? At this
> point, I am stuck with angular - i would have to reload the whole page to
> get that to work.
>
> Turns out there are only 3 lines of code needed to enable angular to
> register new modules after it has been bootstrapped. Here it is:
>
> instanceInjector.loadNewModules = function (mods) {
>> forEach(loadModules(mods), function(fn) { instanceInjector.invoke(fn ||
>> noop); });
>> };
>>
>
> Put this code on about line 3005 in angularjs-1.2.0.rc2 (towards the end
> of the createInjector function, before the return statement) and voila -
> you have a new function you can call to notify angular that a new module
> has been loaded and it needs to be registered into angular's runtime.
>
> This is what I do in my gadget app:
>
> - When a gadget is added, I first use requireJS to load the javascript
> that the gadget requires. (you can use any script loader here, not just
> requireJS)
> - When the module code is loading it will be parsed and executed by
> the browser. The code does things like *angular.module('name of
> module here', [])* and *angular.module('name of module
> here').service('someService,.....)* to define the new module and give
> it some controllers and services
> - when all the script for the new module have finished loading, I then
> call $injector.loadNewModules(['name of module here']). This invokes the
> new code above.
> - Lastly, I do a $compile and $rootScope.$digest() to get the gadget
> moving
>
> Why I think this should be added to angular:
>
> 1. The presence of this code does not change, alter, affect regular
> angularjs users in any way
> 2. The code is already in angular js - i'm just exposing it through an
> accessible point
> 3. It will enable other library writers to be able to extend angularjs
> more easily and do cool stuff
> 4. It allows angular to be more modular and scalable - using bandwidth
> more intelligently
> 5. I've seen many forum posts raised by ppl wanting to be able to do
> this sort of thing. I've seen some workaround suggested that work in some
> cases, but may break when ppl upgrade angular down the track.
>
> Any one agree? Disagree?
>
--
You received this message because you are subscribed to the Google Groups
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.