AngularJS';s$注射器

AngularJS';s$注射器,angularjs,Angularjs,为什么或者为什么不应该将angular的$injector本身注入,而不是将分离的、命名的依赖项作为参数注入控制器的构造函数?虽然使用$injector服务可以很好地工作,但我可以想到两个我个人永远不会这样做的原因: 这是一个完全没有必要的麻烦 它模糊了组件或组件的依赖关系 要进行说明,请参见这两者之间的区别: app.controller('myController', function($scope, myService) { }) 及 上面的两个例子做了同样的事情,但我相信第一个在意图上

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

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

  • 这是一个完全没有必要的麻烦
  • 它模糊了组件或组件的依赖关系
  • 要进行说明,请参见这两者之间的区别:

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

    上面的两个例子做了同样的事情,但我相信第一个在意图上要清楚得多

    但是,请注意,有些情况下可能需要直接使用喷油器:存在循环依赖关系时。举个(愚蠢的)例子:

    这将返回错误,因为喷油器无法在另一个喷油器之前创建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,而是仅在调用相关函数时从注入器发出请求,此时不再存在争用条件。

    “$injector用于检索由提供程序定义的对象实例、实例化类型、调用方法和加载模块…”这是一个实用程序问题,我特别不认为在控制器上使用此功能的原因。在某些用例中,您的依赖关系可能可用,也可能不可用,这可以通过使用
    $injector
    服务来实现。一个例子是
    $animate
    服务,其中许多库使用此
    $injector
    模式
    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';
            }
        }
    });
    
    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';
            }
        }
    });