考虑以下代码:
angular.module('app', [])
.controller('MainCtrl', function ($scope) {
...
});
我知道为了避免JS缩小时的注入问题,应该使用依赖注入的数组形式:
angular.module('app', [])
.controller('MainCtrl', ['$scope', function ($scope) {
...
}]);
但Angular如何知道第一个案例(非数组)注入的内容?如果我使用.controller('MainCtrl', function (scop)
代替$scope
怎么办?它解析我的JS并查找与其某些提供者匹配的函数参数名吗?
答案 0 :(得分:4)
请注意,controller
的函数是函数controller
的参数。这允许Angular在变量中获取该函数并分析其参数,并使用该角度列出需要注入的服务。
在下面的代码中,您可以看到Angular在幕后的作用,以便匹配这些参数:
var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function annotate (fn) {
var $inject = [];
fn = fn.toString();
var first = fn.replace(STRIP_COMMENTS, '');
var second = first.match(FN_ARGS)[1];
var third = second.split(FN_ARG_SPLIT);
third.forEach(function (arg) {
arg.replace(FN_ARG, function (all, underscore, name) {
$inject.push(name);
});
});
return $inject;
}