您好我想在加载任何控制器之前从工厂加载数据。我找到了一种使用resolve的方法:
angular.module('agent', ['ngRoute','ui.bootstrap','general_module', 'order_module','customer_module']).config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/customer', {
templateUrl: 'customer_module/partials/customer.php',
resolve:{
'MyServiceData':function(loginvalidation){
// MyServiceData will also be injectable in your controller, if you don't want this you could create a new promise with the $q service
var a=loginvalidation.check_usertype();
}}
}
);
$routeProvider.otherwise({redirectTo: '/customer'});
}]);
但问题是我必须在每一条路线上复制这个。在启动任何控制器之前,angularjs中是否有一种方法可以将代码写入一次以加载服务(不重复我的代码)?
由于
答案 0 :(得分:1)
我做的一件事是在我的控制器功能中,我在根级别没有任何代码。只有函数声明。见这里:
angular.module('app').controller('TestCtrl',function($scope){
//no code here at root level, except for some init call
init();
function init(){
//some init code
service.getSomeData().then(function(data){
//Tell your controller to run here
$scope.dataLoaded = true;
doSomethingWithData(data);
});
}
function addSomeWatch(){
//some watch code here
}
function foo(bar){
//something crazy
}
});
唯一依赖的是你的服务调用所有的返回承诺,无论如何他们都应该这样做。
angular.module('app').factory('TestService', function(){
return {
getSomeData : function(){
var d = $q.deferred();
$http.get('someurl')
.then(function(resp){
d.resolve(resp);
});
return d.promise;
}
}
});