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; |
