AngularJS - DI系统是如何知道参数的名字的?
AngularJS - How does the DI system know of the name of the arguments?
直接从官方网站的例子:
function PhoneListCtrl ($scope, $http) {
$http.get('phones/phones.json').success(function(data) {
$scope.phones = data;
});
$scope.orderProp = 'age';
}
$scope
和$http
参数是唯一标识符,用于在DI系统中定位相应的AngularJS服务。那么,DI系统究竟如何检索这些参数的变量名呢?
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
if (!($inject = fn.$inject)) {
$inject = [];
fnText = fn.toString().replace(STRIP_COMMENTS, '');
argDecl = fnText.match(FN_ARGS);
angular.forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
arg.replace(FN_ARG, function(all, underscore, name){
$inject.push(name);
});
});
fn.$inject = $inject;
}
return fn.$inject;
}
Demo: Fiddle(查看控制台);
步骤:
1. 在函数中调用toString
返回函数源
2. 使用regex
删除所有注释3.使用regex
直接从源代码@GitHub:
的参数中提取依赖项是最简单的形式这个函数。这是通过将函数转换为字符串来实现的使用toString()
方法提取参数名称。// Given function MyController($scope, $route) { // ... } // Then expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
和注释函数
function annotate(fn) {
var $inject,
fnText,
argDecl,
last;
if (typeof fn == 'function') {
if (!($inject = fn.$inject)) {
$inject = [];
fnText = fn.toString().replace(STRIP_COMMENTS, '');
argDecl = fnText.match(FN_ARGS);
forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
arg.replace(FN_ARG, function(all, underscore, name){
$inject.push(name);
});
});
fn.$inject = $inject;
}
} else if (isArray(fn)) {
last = fn.length - 1;
assertArgFn(fn[last], 'fn')
$inject = fn.slice(0, last);
} else {
assertArgFn(fn, 'fn', true);
}
return $inject;
}
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 使用Express捕获参数
- 如何知道函数的参数中传递的var名称
- Node.js如何知道回调的第一个参数是否是错误处理程序
- javascript回调如何知道它们的参数
- 是否有可能知道用户何时点击YouTube视频上的广告
- $scope函数参数从何而来
- 你怎么知道要为 javascript 函数设置哪些参数
- 如何知道jQuery回调函数中有哪些参数可用,如何理解它并添加参数
- Don'我不知道如何发送带有get请求参数的字符串
- 下面的Javascript函数是通过值还是通过引用传递参数?我不知道如何区分这两者
- 获取“未定义无参数构造函数”;错误,不知道为什么
- 如何知道这个javascript函数中参数的值
- web服务器如何知道在提交表单时使用哪些参数?
- 函数能知道它作为参数使用的变量的名称吗
- 在MongoDB中,当搜索多个参数时,如何知道哪个参数匹配
- 传递给高阶函数的函数中的参数从何而来
- AngularJS - DI系统是如何知道参数的名字的?
- 在javascript中,我如何知道函数所期望的参数类型
- Backbone JS:集合视图中表示模型的参数从何而来?