AngularJS依赖注入时序问题

时间:2015-04-02 12:14:53

标签: javascript angularjs

我有问题相关的AngularJS依赖注入和它们之间的时间安排。这是我的代码和错误

var module = angular.module('Demo', []);

module.factory('demo', function () {
        return {
            data: {},
        };
    });

module.provider('foo', ['demo', function(demo) {
    console.log(demo);

    this.$get = function() {
    };
}]);

错误:

Uncaught Error: [$injector:modulerr] Failed to instantiate module Demo due to:
Error: [$injector:unpr] Unknown provider: demo

但是如果我在最后一个定义中添加setTimeout一切正常,但它的黑客代码应该不是这样的。

var module = angular.module('Demo', []);

module.factory('demo', function () {
        return {
            data: {},
        };
    });
setTimeout(function(){
module.provider('foo', ['demo', function(demo) {
    console.log(demo);

    this.$get = function() {
    };
}]);

});

这是小提琴上的问题: http://jsfiddle.net/zcf7rb4s/1/

2 个答案:

答案 0 :(得分:1)

您不能将demo添加为依赖项,因为它尚不存在。这就是$injector的工作方式。您可以做的是将demo列为提供程序的$get函数中的依赖项。在定义所有提供程序后,$injector 将执行该操作。

检查this

<div ng-app="Demo">
    <div ng-controller="test">{{x}}</div>
</div>

定义:

var module = angular.module('Demo', []);

module.factory('demo', function () {
        return {
            data: {x: 'x'},
        };
    });

module.provider('foo', function() {
    this.$get = function(demo) {
        return {
            demo: demo
        };
    };
});

module.controller('test', ['$scope', 'foo', function($scope, foo) {
    $scope.x = foo.demo.data.x;
}]);

工厂和提供程序内的代码在“步骤1”运行。 然后,在“步骤2”中,AngularJS绑定控制器。它首先使用$injector来注入依赖项(之前已在“步骤1”中定义)。所以在实践中你的$timeout“模仿”这种行为,这就是它的工作原理。但这是错误的,这不是你应该使用它们的方式。

答案 1 :(得分:0)

这样注入提供者:

module.provider('foo', function() {
    this.$get = ['demo', function(demo) {
        console.log(demo);
    }];
});