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, 当然手动的话自己就要搞清楚顺序啦 ^^



 




 

 

posted @ 2014-08-12 02:57  兴杰  阅读(920)  评论(0)    收藏  举报