AngularJS:使用服务进行多次解析的路由未触发

时间:2015-06-10 02:03:45

标签: javascript angularjs angularjs-scope angular-ui-router angular-promise

我正在配置一个AngularJS应用程序,并且在控制器加载之前确保我的承诺被解雇时遇到一些麻烦。我的理解是,这可以做到。一点代码:

首先,这是路由器代码:

$routeProvider
    .when('/apage', {
        controller: 'APageController',
        templateUrl: 'app/apage/apage.view.html',
        requiresLogin: true,
        resolve: {
            "data": function($q, data1Service, data2Service) {
                var data1 = data1Service.getData();
                var data2 = data2Service.getData();
                return $q.all({
                    data1: data1.$promise,
                    data2: data2.$promise});
            }   
        }   
    })
... 

这是一个服务功能(两者都相似)......

function getData() {
    var deferred = $q.defer();
    $http(req)
        .success(function(data, status, headers, config) {
            // store data ...
            deferred.resolve(1); // just a flag to say it worked
            $rootScope.$apply();
        })
        .error(function(data, status, headers, config) {
            deferred.resolve(0);
            $rootScope.$apply();
        });
    return deferred.promise;
}

这是控制器代码......

angular
    .module('app')
    .controller('APageController', APageController);
  
    APageController.$inject = [... 'data'];
    function APageController(... data) {
        var data1 = data.data1;
        var data2 = data.data2;
        ...

这三个文件都在不同的文件中,但是同一模块的一部分。必须有一些我忽略的概念。这里有什么明显可以解释为什么我的决心承诺没有解决?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您将对象字面值传递给q.all,它将立即解析。而是传递承诺数组,以便等待它解决拒绝。在您的情况下也不需要.$promise,因为您已经从服务中返回了一个承诺(基于显示的代码)。 $promise通常由$resource

返回的对象附加

return $q.all([data1Service.getData(),
               data2Service.getData()]);

并期望data成为从2次以上调用中解析的数据数组。

或创建2个结算:

 resolve: {
        "data": function($q, data1Service, data2Service) {
            return data1Service.getData();
        },
        "data2": function($q, data1Service, data2Service) {
            return data2Service.getData();
        }    
    }   

并注入datadata2

否则,链接并更改响应格式以期望您最初尝试获取的方式。

   resolve: {
        "data": function($q, data1Service, data2Service) {
            return $q.all([data1Service.getData(),data2Service.getData()])
                  .then(function(response){
                   return {
                           data1:response[0], 
                           data2:response[1]
                          };
                });
        }   
    }   

不要将rootScope.apply放在你的服务中,它会导致摘要已经在进行中错误(因为有角度)。 $http会自动解决此问题。

你只需要这个。

function getData() {
    return $http(req);
}