2015-04-02 216 views
0

我有问题相关的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/

回答

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“模拟”这种行为,这就是它的工作原理。但是这是错误的,那不是你应该使用它们的方式。

0

注入提供这样反而:

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