aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisko Hevery2011-08-02 13:29:12 -0700
committerIgor Minar2011-10-11 10:53:04 -0700
commit25a62b58db31c212c330d1bd7ce58bdd031e114a (patch)
tree9a332f36491740dabeabda1c8fa3062c62076ce8
parent97e3ec4d1b58a253d61c15239002265b33c30a13 (diff)
downloadangular.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.js2
-rw-r--r--src/Injector.js5
-rw-r--r--src/directives.js1
-rw-r--r--test/InjectorSpec.js25
-rw-r--r--test/directivesSpec.js10
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();
});