我在它们之间存在与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/
不能将demo
添加为依赖项,因为它还不存在。$injector
就是这样工作的。您可以在提供程序的$get
函数中将demo
列为依赖项。这将由$injector
在定义所有提供程序之后执行。
检查此项:
<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
"模拟"了这种行为,这就是它工作的原因。但这是错误的,这不是你应该使用它们的方式。
向提供程序中注入如下内容:
module.provider('foo', function() {
this.$get = ['demo', function(demo) {
console.log(demo);
}];
});