AngularJS的$注入器

时间:2016-12-16 13:11:58

标签: angularjs

为什么或为什么不应该注入angular的$ injector本身而不是将分离的,命名的依赖项作为参数注入控制器的构造函数?

1 个答案:

答案 0 :(得分:1)

虽然使用$ injector服务可以正常工作,但我可以想到两个原因,我个人永远不会这样做:

  1. 这是一件非常不必要的麻烦
  2. 它模糊了组件的依赖关系。
  3. 为了说明,请看这两者之间的区别:

    app.controller('myController', function($scope, myService) {
    })
    

    app.controller('myController', function($injector) {
        var $scope = $injector.get('$scope');
        var myService= $injector.get('myService');
    })
    

    上面两个例子做了同样的事情,但我相信第一个在意图上更加清晰。

    请注意,有些情况下可能需要直接使用注射器:当存在循环依赖时。拿这个(愚蠢的)例子:

    app.factory('service1', function(service2) {
        return {
            someFunction: function() {
                return service2.otherFunction();
            },
            otherFunction: function() {
                return 'result from service 1 other function';
            }
        }
    });
    app.factory('service2', function(service1) {
        return {
            someFunction: function() {
                return service1.otherFunction();
            },
            otherFunction: function() {
                return 'result from service 2 other function';
            }
        }
    });
    

    由于进样器无法在另一个之前创建service1 service2,因此会返回错误。在这种情况下,您可以执行以下操作:

    app.factory('service1', function(service2) {
        return {
            someFunction: function() {
                return service2.otherFunction();
            },
            otherFunction: function() {
                return 'result from service 1 other function';
            }
        }
    });
    app.factory('service2', function($injector) {
        return {
            someFunction: function() {
                var service1 = $injector.get('service1');
                return service1.otherFunction();
            },
            otherFunction: function() {
                return 'result from service 2 other function';
            }
        }
    });
    

    注意service1不再注入service2,但仅在调用相关函数时才从进样器中询问,此时不再存在竞争条件。