Craig, did you find any better way to do this by creating an external 
function or something?

I have tried to use this fork and works as expected and solves our problem 
without $compile and $rootScope.$digest(), is this something required?

On Wednesday, January 8, 2014 8:32:28 AM UTC+5:30, Craig Leyshan wrote:
>
> I forked initially as I was just playing with the idea and didnt really 
> think it would end up as a pull request.
>
> As to making the interface to this a little more intuitive, I agree it 
> could be improved.  I was going for minimal change to angular, and also 
> trying not to assume anything about how the new modules get loaded 
> dynamically (requirejs, or something else).  I think alternative methods of 
> invoking this could be done by calling the new method I have added to 
> injector.  So almost treat the new method as a utility that can be used to 
> build plugins or frameworks that provide a more integrated or seamless 
> experience for the developer using a particular technology set (angular as 
> far as i know cant load JS dynamically, it needs help from something like 
> requirejs).  The underlying functionality already existed on injector and 
> that is why I put the new function there.
>
> On Wednesday, January 8, 2014 1:18:19 PM UTC+11, Robert Koritnik wrote:
>>
>> Why did you decide to fork Angular code and not rather create a pull 
>> request on original repository?
>> Although I think it would be much nicer if we could call this instead:
>>
>> angular.module("SomeModule").requires(["Module1", "Module2",...]);
>>
>> It would make it more concise and easy to understand and use. It is part 
>> of module functionality so it would make much more sense to add an 
>> additional function to Module type.
>>
>> On Tuesday, 29 October 2013 04:37:38 UTC+1, Craig Leyshan wrote:
>>>
>>> Fork of angular.js created on GitHub for this change:  
>>> https://github.com/cleyshan/angular.js/tree/module-loading-after-bootstrap
>>>
>>> On Thursday, October 24, 2013 5:11:28 PM UTC+11, 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 http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to