From 085e3c611fd0cd48757702c50c67b551a00a0d38 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Tue, 8 Nov 2011 17:40:03 -0800 Subject: new(directive): added ng:module directive for loading modules --- src/Angular.js | 1 + src/AngularPublic.js | 4 +--- src/Injector.js | 31 ++++++++++++++++++------------- src/directives.js | 16 ++++++++++++---- src/service/compiler.js | 14 ++++++++------ 5 files changed, 40 insertions(+), 26 deletions(-) (limited to 'src') 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;}));
  1. - + {{name}}      
  2. @@ -700,9 +699,9 @@ angularDirective("ng:class-odd", ngClass(function(i){return i % 2 === 0;})); 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/); }); @@ -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)); } }); } -- cgit v1.2.3