Mat*_*ork 10 javascript dependency-injection angularjs
在AngularJS中,这两个控制器声明是等效的:
function BlahCtrl($scope, $http) { ... }
function BlahCtrl($http, $scope) { ... }
Run Code Online (Sandbox Code Playgroud)
双方$http并$scope会正确的变量,不管他们是什么样的顺序,即命名变量$http将始终通过实例$http的服务.
Angular如何知道传入哪些对象以及以什么顺序传递?我认为javascript无法实现这种反射.
Den*_*nis 13
如果调用toString函数,则获得该函数的js声明:
function a(b,c) {}
a.toString(); // "function a(b,c){}"
Run Code Online (Sandbox Code Playgroud)
然后你可以解析字符串的参数顺序.
对角度源代码的一些调查证实了这一点:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
它们对函数进行字符串化,然后使用正则表达式提取参数并将它们存储在数组中.
jsFiddle显示这一切是如何工作的.
| 归档时间: |
|
| 查看次数: |
820 次 |
| 最近记录: |