injector
angular 提供了一套依赖注入的机制,和后台很像。虽然我不觉得有很重要。
var $injector = angular.injector(["myModule"]);
var serviceInstance = $injector.get("serviceName"); //可以获取到service
has_service = $injector.has("serviceName");
$injector.invoke(['serviceA', function(serviceA){}]); //我们很多函数都是通过这个方式实现依赖注入和执行的
var output = '<div>' + '<div>' + '{{name}}' + '</div>' + '</div>'; var $injector = angular.injector(["ng"]); $injector.invoke(["$rootScope", "$compile", function ($rootScope, $compile) { var scope = $rootScope.$new(); //创建继承scope scope.name = "933"; var link = $compile(output); //编辑 {{}}也是指令的一种 var node = link(scope); //与scope绑定 $rootScope.$digest(); //渲染 document.body.appendChild(node[0]); }]);
这是一个手动的解析过程,大致了解一下解析过程.
更新 2015-10-14
循环依赖 error
app.config(["$httpProvider", function ($httpProvider) { $httpProvider.interceptors.push(["Account.user", "$injector", function (user, $injector) { //note : set all ajax request header for premission return { request: function (config) { var accountService = $injector.get("Account.service"); //note : manual inject, prevent 循环依赖 log(accountService); log("prevent 循环依赖成功"); config.headers = config.headers || {}; if (user.account) config.headers["selectedAccountTypeName"] = accountService.getTypeNameFromOdataTypeName(user.account["@odata.type"]); if (user.role) config.headers["selectedRoleTypeName"] = accountService.getTypeNameFromOdataTypeName(user.role["@odata.type"]); return config; }, }; }]); }]);
上面的这个例子,假设 Account.user这个service 依赖注入了 $http 那么这里就会报错了.
推出是因为angular 并不是等到$http service 完成后才去依赖注入 Account.user的。
要解决这个问题我们可以注入 $injector 然后手动调用 $injector.get("Account.user") 来获取service, 当然手动的话自己就要搞清楚顺序啦 ^^