在控制器之前从服务加载数据

时间:2014-03-06 00:05:04

标签: javascript angularjs angularjs-directive angularjs-service angularjs-routing

您好我想在加载任何控制器之前从工厂加载数据。我找到了一种使用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中是否有一种方法可以将代码写入一次以加载服务(不重复我的代码)?

由于

1 个答案:

答案 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;
        }
    }

});