diff options
| -rw-r--r-- | src/Angular.js | 1 | ||||
| -rw-r--r-- | src/AngularPublic.js | 4 | ||||
| -rw-r--r-- | src/Injector.js | 31 | ||||
| -rw-r--r-- | src/directives.js | 16 | ||||
| -rw-r--r-- | src/service/compiler.js | 14 | ||||
| -rw-r--r-- | test/directivesSpec.js | 13 | ||||
| -rw-r--r-- | test/scenario/mocks.js | 4 | 
7 files changed, 57 insertions, 26 deletions
diff --git a/src/Angular.js b/src/Angular.js index 7b9bd1db..a191c0c7 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -1028,6 +1028,7 @@ function publishExternalAPI(angular){      'copy': copy,      'extend': extend,      'equals': equals, +    'element': jqLite,      'forEach': forEach,      'injector': function(){ return createInjector(arguments, angularModule); },      'noop':noop, diff --git a/src/AngularPublic.js b/src/AngularPublic.js index 64a7bf4d..6403c4ff 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -1,9 +1,7 @@  'use strict'; -publishExternalAPI(angular); -  //try to bind to jquery now so that one can write angular.element().read()  //but we will rebind on bootstrap again.  bindJQuery(); - +publishExternalAPI(angular); diff --git a/src/Injector.js b/src/Injector.js index eacb8699..58b30fda 100644 --- a/src/Injector.js +++ b/src/Injector.js @@ -167,24 +167,29 @@ function createInjector(modulesToLoad, moduleRegistry) {        instance = new Constructor();        return invoke(instance, Type, locals) || instance;      }; +    injector.loadModule = loadModule;      return injector;    } - -  forEach(modulesToLoad, function(module){ -    if (isString(module)) { -      if (moduleRegistry[module]) { -        module = moduleRegistry[module]; +  function loadModule(modulesToLoad){ +    forEach(isString(modulesToLoad) ? modulesToLoad.split(',') : modulesToLoad, function(module) { +      if (isString(module)) { +        if (moduleRegistry[module = trim(module)]) { +          module = moduleRegistry[module]; +        } else { +          throw Error("Module '" + module + "' is not defined!"); +        } +      } +      if (isFunction(module) || isArray(module)) { +        $injector(module);        } else { -        throw Error("Module '" + module + "' is not defined!"); +        assertArgFn(module, 'module');        } -    } -    if (isFunction(module) || isArray(module)) { -      $injector(module); -    } else { -      assertArgFn(module, 'module'); -    } -  }); +    }); +  } + + +  loadModule(modulesToLoad);    // instantiate $eager providers    // for perf we can't do forEach diff --git a/src/directives.js b/src/directives.js index b511541f..9361f08f 100644 --- a/src/directives.js +++ b/src/directives.js @@ -690,8 +690,7 @@ angularDirective("ng:class-odd", ngClass(function(i){return i % 2 === 0;}));       <doc:source>          <ol ng:init="names=['John', 'Mary', 'Cate', 'Suz']">            <li ng:repeat="name in names"> -           <span ng:class-odd="'ng-format-negative'" -                 ng:class-even="'ng-input-indicator-wait'"> +           <span ng:class-odd="'odd'" ng:class-even="'even'">               {{name}}                   </span>            </li> @@ -700,9 +699,9 @@ angularDirective("ng:class-odd", ngClass(function(i){return i % 2 === 0;}));       <doc:scenario>         it('should check ng:class-odd and ng:class-even', function() {           expect(element('.doc-example-live li:first span').prop('className')). -           toMatch(/ng-format-negative/); +           toMatch(/odd/);           expect(element('.doc-example-live li:last span').prop('className')). -           toMatch(/ng-input-indicator-wait/); +           toMatch(/even/);         });       </doc:scenario>     </doc:example> @@ -888,3 +887,12 @@ angularDirective("ng:cloak", function(expression, element) {    element.removeAttr('ng:cloak');    element.removeClass('ng-cloak');  }); + +angularDirective('ng:module', ['$value', '$injector', +                       function(modules,  $injector) { +  forEach(modules.split(','), function(module){ +    if (module = trim(module)) { +      $injector.loadModule(module); +    } +  }); +}]); diff --git a/src/service/compiler.js b/src/service/compiler.js index 220d9c39..1bd2cbe0 100644 --- a/src/service/compiler.js +++ b/src/service/compiler.js @@ -27,7 +27,11 @@ function $CompileProvider(){            }            forEach(this.linkFns, function(fn) {              try { -              $injector.invoke(childScope, fn, locals); +              if (isArray(fn) || fn.$inject) { +                $injector.invoke(childScope, fn, locals); +              } else { +                fn.call(childScope, element); +              }              } catch (e) {                $exceptionHandler(e);              } @@ -52,10 +56,6 @@ function $CompileProvider(){          addLinkFn:function(linkingFn) {            if (linkingFn) { -            //TODO(misko): temporary hack. -            if (isFunction(linkingFn) && !linkingFn.$inject) { -              linkingFn.$inject = ['$element']; -            }              this.linkFns.push(linkingFn);            }          }, @@ -298,7 +298,9 @@ function $CompileProvider(){                fn = directiveFns[name];                if (fn) {                  element.addClass('ng-directive'); -                template.addLinkFn((directiveFns[name]).call(selfApi, value, element)); +                template.addLinkFn((isArray(fn) || fn.$inject) +                  ? $injector.invoke(selfApi, fn, {$value:value, $element: element}) +                  : fn.call(selfApi, value, element));                }              });            } diff --git a/test/directivesSpec.js b/test/directivesSpec.js index 93682fa0..51cc5489 100644 --- a/test/directivesSpec.js +++ b/test/directivesSpec.js @@ -535,4 +535,17 @@ describe("directive", function() {        expect(element.hasClass('bar')).toBe(true);      }));    }); + +  describe('ng:module', function() { +    it('should install the modules', inject(function($injector, $compile, $rootScope) { +      var log = ''; +      var injector = $injector; +      angular.module.a = function($injector){ log += ($injector == injector) + ';';}; +      angular.module.b = function($injector){ log += ($injector == injector); } +      $compile('<div ng:module="   a, ,,, b "></div>')($rootScope); +      expect(log).toEqual('true;true'); +      delete angular.module.a; +      delete angular.module.b; +    })); +  });  }); diff --git a/test/scenario/mocks.js b/test/scenario/mocks.js index 5b7f7fcc..2db8577a 100644 --- a/test/scenario/mocks.js +++ b/test/scenario/mocks.js @@ -11,6 +11,10 @@ angular.scenario.testing.MockAngular.prototype.reset = function() {    this.log = [];  }; +angular.scenario.testing.MockAngular.prototype.element = function(e) { +  return jqLite(e); +}; +  angular.scenario.testing.MockAngular.prototype.$browser = function() {    this.log.push('$brower()');    return this;  | 
