0

我希望我的 Angular 应用程序在将路由更改为某个路径之前解决一个承诺:

va.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/sendungen', {templateUrl: '../partials/sendungen.php',   controller: 'OverviewCtrl',resolve: {
            shipments: oc.fetchAllShipments
        }}).
        // ...
}]);

函数 fetchAllShipments():

oc.fetchAllShipments = function(shipment){
    shipment.fetchAllShipments().then(function(promise){
        shipment.allShipments = promise.data;
    });
};

然后控制器应将数据从装运服务复制到其$scope

va.controller('OverviewCtrl',function($scope,$http,shipment){
    $scope.allShipments = shipment.allShipments;
});

只要我从应用程序中更改路由,一切都工作正常,例如我加载主页,然后切换到 /sendungen

但是,如果我已经在该路径上并决定刷新页面,则应用程序会在数据似乎被解析之前加载。这只是偶尔发生,似乎取决于他的脚本执行速度。

我如何防止这种行为?

4

2 回答 2

3

中的函数resolve应该返回 a promise,而不是像您的oc.fetchAllShipments方法中那样。

resolve- 一个可选的依赖关系映射,应该注入到控制器中。如果这些依赖项中的任何一个是承诺,路由器将等待它们全部解决或在控制器实例化之前被拒绝。如果所有的 Promise 都成功解决,则注入已解决的 Promise 的值并触发 $routeChangeSuccess 事件。

例如:

resolve: {
  shipments: ['$q', function($q){
     var deffered = $q.defer();

     shipment.fetchAllShipments().then(function(res){
        deffered.resolve(res);
     });

     return deffered.promise;
  }]
}
于 2013-10-28T10:26:47.240 回答
-3

快速而肮脏的解决方法是使用 $timeout:

va.controller('OverviewCtrl',function($scope,$http,shipment, $timeout){
    $timeout(function(){$scope.allShipments = shipment.allShipments}, 1000);
});
于 2013-10-28T10:01:30.467 回答