[英]AngularJS - Initialize services before controller
我试图在控制器开始运行之前初始化我的应用程序服务。
我本以为我可以通过首先解决一个承诺返回功能来实现这一点:
va.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {templateUrl: '../partials/home.php', controller: 'VaCtrl',resolve: {
pp: vac.loadData
}});
}]);
var vac = va.controller('VaCtrl',function($scope,$http,$q,packingProvider){
console.dir(packingProvider.data[2]);
});
vac.loadData = function($http,$timeout,$q,packingProvider){
$http.post('../sys/core/fetchPacking.php').then(function(promise){
packingProvider.data = promise.data;
});
var defer = $q.defer();
$timeout(function(){
defer.resolve();
},2000);
return defer.promise;
};
但是,在解决承诺之前,控制器仍处于加载状态,导致控制台大吼大叫
无法读取未定义的属性“ 2”
对我。
我究竟做错了什么?
编辑:
另外,控制器似乎被调用两次,第一次是使用未定义的pacingProvider.data对象,第二次是使用secons,一切正常。
注意:尽管这可以解决您的问题,但是此答案可能是正确的解决方案。
服务始终在控制器之前初始化。 正如您所说,问题是您的诺言尚未产生。 最好的选择就是遵守承诺。
不要公开data
对象,而是公开promise并使用它:
vac.loadData = function($http,$timeout,$q,packingProvider){
packingProvider.data = $http.post('../sys/core/fetchPacking.php');
return packingProvider.data;
};
并且在您的控制器中,始终与诺言相关联,在第一次解决之后,它将在下一个滴答中得到解决:
var vac = va.controller('VaCtrl',function($scope,$http,$q,packingProvider){
packingProvider.data.then(function(value) {
console.dir(value[2]);
});
});
而不是使用的promise
通过返回$timeout
,你可以直接使用promise
通过返回$http
。
用这种方式重写您的loadData
vac.loadData = function($http,$timeout,$q,packingProvider){
var promise = $http.post('../sys/core/fetchPacking.php').then(function(promise){
packingProvider.data = promise.data;
});
return promise;
};
在此处阅读General Usage
部分的第一行- $ http promise
而且, resolve
是一张依赖关系图 。
resolve-{Object。=}-可选的依赖关系映射,应将其注入到控制器中。 如果这些依赖关系中的任何一个是应许的,路由器将在实例化控制器之前等待所有这些依赖关系被解决或一个被拒绝。
因此,Angular将自动公开地图以进行注入。 因此,您可以这样做-
var vac = va.controller('VaCtrl', function($scope, pp){
// 'pp' is the name of the value in the resolve map for $routeProvider.
console.dir(pp[2]);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.