在my last question中,我确实搜索了一个解决方案,以便在.config
期间使用AngularJS中的值。我知道我必须使用提供者。现在我尝试使用此提供程序设置值。似乎提供商存在限制,我可以在.config
期间设置一些内容吗?我收到错误“TypeError:appState.setState不是函数”,但setState
是一个函数,至少对我的理解。我错了?
代码:
angular
.module('main', [
'ngRoute'
])
.provider('appState', function(){
var appState;
this.setState = function(newState) {
appState = newState;
};
this.getState = function() {
return appState;
};
this.$get = function() {
return appState;
};
function init() {appState='/home';}
init();
})
.config(function($routeProvider, appStateProvider){
$routeProvider
.when('/home', {
templateUrl: "partials/home"
})
.when('/info', {
templateUrl: "partials/info"
})
.otherwise({
redirectTo: appStateProvider.getState()
})
})
.run(function ($rootScope, appState) {
$rootScope.$on('$routeChangeStart', function (event, next, current) {
if (next.$$route) {
appState.setState(next.originalPath);
// -> ERROR: "TypeError: appState.setState is not a function"
}
})
})
;
答案 0 :(得分:1)
提供商就像一个由两部分组成的服务,其最小形式就像一个工厂:
aModule.provider('foo', function() {
this.$get = function() {
return 1;
}
});
然后你可以在任何其他服务,指令,控制器和run
函数中注入它:
aModule.controller('BarCtrl', function(foo) { ... });
注意我是如何使用foo
作为提供者的名称。
这样做是向控制器注入$get
返回的内容。 AKA,如果您在控制器中记录foo
,您将获得 1 。
那么提供者的意义何在?能够在应用程序运行之前配置服务。
aModule.provider('foo', function() {
var appState;
this.setState = function(newState) {
appState = newState;
}
this.$get = function() {
return appState;
}
});
在这种情况下,除$get
函数外,我们还有其他一些功能。我们怎样才能使用它们?我们需要注入提供者本身并且不工厂。我们怎么能这样做?
aModule.config(function(fooProvider) {
fooProvider.setState('Hello');
}
请注意我这次使用的时间是fooProvider
,而不仅仅是foo
。这就是说我注射了提供者本身。也就是说,提供者只能注入.config
函数和其他提供者的构造函数。
现在,如果您在我们的控制器中记录foo
,我们会看到:您好。
我再说一遍,你在控制器中注入的是$get
返回的内容,而不是其他方法。这就是为什么你不能在setState
上使用run
,因为你注入的是$get
返回的内容。