diff options
| author | Misko Hevery | 2011-08-02 13:29:12 -0700 |
|---|---|---|
| committer | Igor Minar | 2011-10-11 10:53:04 -0700 |
| commit | 25a62b58db31c212c330d1bd7ce58bdd031e114a (patch) | |
| tree | 9a332f36491740dabeabda1c8fa3062c62076ce8 | |
| parent | 97e3ec4d1b58a253d61c15239002265b33c30a13 (diff) | |
| download | angular.js-25a62b58db31c212c330d1bd7ce58bdd031e114a.tar.bz2 | |
refactor(injection) infer injection args in ng:controller only
Because only controllers don't have currying, we can infer its arguments, all other APIs needing currying, automatic inference complicates the matters unecessary.
| -rw-r--r-- | src/Compiler.js | 2 | ||||
| -rw-r--r-- | src/Injector.js | 5 | ||||
| -rw-r--r-- | src/directives.js | 1 | ||||
| -rw-r--r-- | test/InjectorSpec.js | 25 | ||||
| -rw-r--r-- | test/directivesSpec.js | 10 |
5 files changed, 27 insertions, 16 deletions
diff --git a/src/Compiler.js b/src/Compiler.js index 0001f8af..a355444b 100644 --- a/src/Compiler.js +++ b/src/Compiler.js @@ -40,8 +40,6 @@ Template.prototype = { addLinkFn:function(linkingFn) { if (linkingFn) { - if (!linkingFn.$inject) - linkingFn.$inject = []; this.linkFns.push(linkingFn); } }, diff --git a/src/Injector.js b/src/Injector.js index 912e911c..0e0fddf6 100644 --- a/src/Injector.js +++ b/src/Injector.js @@ -60,6 +60,7 @@ function createInjector(factoryScope, factories, instanceCache) { if (!(value in instanceCache)) { var factory = factories[value]; if (!factory) throw Error("Unknown provider for '"+value+"'."); + inferInjectionArgs(factory); instanceCache[value] = invoke(factoryScope, factory); } return instanceCache[value]; @@ -67,7 +68,7 @@ function createInjector(factoryScope, factories, instanceCache) { function invoke(self, fn, args){ args = args || []; - var injectNames = injectionArgs(fn); + var injectNames = fn.$inject || []; var i = injectNames.length; while(i--) { args.unshift(injector(injectNames[i])); @@ -133,7 +134,7 @@ var FN_ARGS = /^function\s*[^\(]*\(([^\)]*)\)/m; var FN_ARG_SPLIT = /,/; var FN_ARG = /^\s*(.+?)\s*$/; var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; -function injectionArgs(fn) { +function inferInjectionArgs(fn) { assertArgFn(fn); if (!fn.$inject) { var args = fn.$inject = []; diff --git a/src/directives.js b/src/directives.js index 4e2b92d4..ca9fe4fc 100644 --- a/src/directives.js +++ b/src/directives.js @@ -174,6 +174,7 @@ angularDirective("ng:controller", function(expression){ getter(scope, expression, true) || getter(window, expression, true); assertArgFn(Controller, expression); + inferInjectionArgs(Controller); return Controller; }); return noop; diff --git a/test/InjectorSpec.js b/test/InjectorSpec.js index a8ac0eee..ab4f3437 100644 --- a/test/InjectorSpec.js +++ b/test/InjectorSpec.js @@ -85,11 +85,11 @@ describe('injector', function(){ it('should return $inject', function(){ function fn(){} fn.$inject = ['a']; - expect(injectionArgs(fn)).toBe(fn.$inject); - expect(injectionArgs(function(){})).toEqual([]); - expect(injectionArgs(function (){})).toEqual([]); - expect(injectionArgs(function (){})).toEqual([]); - expect(injectionArgs(function /* */ (){})).toEqual([]); + expect(inferInjectionArgs(fn)).toBe(fn.$inject); + expect(inferInjectionArgs(function(){})).toEqual([]); + expect(inferInjectionArgs(function (){})).toEqual([]); + expect(inferInjectionArgs(function (){})).toEqual([]); + expect(inferInjectionArgs(function /* */ (){})).toEqual([]); }); it('should create $inject', function(){ @@ -103,28 +103,35 @@ describe('injector', function(){ */ _c, /* {some type} */ d){ extraParans();} - expect(injectionArgs($f_n0)).toEqual(['$a', 'b_', '_c', 'd']); + expect(inferInjectionArgs($f_n0)).toEqual(['$a', 'b_', '_c', 'd']); expect($f_n0.$inject).toEqual(['$a', 'b_', '_c', 'd']); }); it('should handle no arg functions', function(){ function $f_n0(){} - expect(injectionArgs($f_n0)).toEqual([]); + expect(inferInjectionArgs($f_n0)).toEqual([]); expect($f_n0.$inject).toEqual([]); }); it('should handle args with both $ and _', function(){ function $f_n0($a_){} - expect(injectionArgs($f_n0)).toEqual(['$a_']); + expect(inferInjectionArgs($f_n0)).toEqual(['$a_']); expect($f_n0.$inject).toEqual(['$a_']); }); it('should throw on non function arg', function(){ expect(function(){ - injectionArgs({}); + inferInjectionArgs({}); }).toThrow(); }); + it('should infer injection on services', function(){ + var scope = angular.scope({ + a: function(){ return 'a';}, + b: function(a){ return a + 'b';} + }); + expect(scope.$service('b')).toEqual('ab'); + }); }); describe('inject', function(){ diff --git a/test/directivesSpec.js b/test/directivesSpec.js index 6dbbfe9d..c925bdb5 100644 --- a/test/directivesSpec.js +++ b/test/directivesSpec.js @@ -469,17 +469,21 @@ describe("directive", function() { expect(scope.$element.text()).toEqual('hey dude!'); }); + it('should infer injection arguments', function(){ + temp.MyController = function($xhr){ + this.$root.someService = $xhr; + }; + var scope = compile('<div ng:controller="temp.MyController"></div>'); + expect(scope.someService).toBe(scope.$service('$xhr')); + }); }); describe('ng:cloak', function() { it('should get removed when an element is compiled', function() { var element = jqLite('<div ng:cloak></div>'); - expect(element.attr('ng:cloak')).toBe(''); - angular.compile(element); - expect(element.attr('ng:cloak')).toBeUndefined(); }); |
