我希望我的Angular应用程序在将路由更改为某个路径之前解决一个承诺:
va.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/sendungen', {templateUrl: '../partials/sendungen.php', controller: 'OverviewCtrl',resolve: {
shipments: oc.fetchAllShipments
}}).
// ...
}]);
funcion 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
但是,如果我已经在该路径上并决定刷新页面,则在数据似乎得到解决之前加载应用程序。这只是偶尔发生,似乎取决于脚本的执行速度。
我如何防止这种行为?
答案 0 :(得分:3)
resolve
中的函数应返回promise
,而不是oc.fetchAllShipments
方法。
resolve
- 可选的地图 应该注入控制器的依赖项。 如果有的话 这些依赖是承诺,路由器将等待它们全部到 在控制器之前被解决或一个被拒绝 实例化。如果所有承诺都成功解决了,那么 注入的Promises的值被注入并且$ routeChangeSuccess 事件被解雇了。
例如:
resolve: {
shipments: ['$q', function($q){
var deffered = $q.defer();
shipment.fetchAllShipments().then(function(res){
deffered.resolve(res);
});
return deffered.promise;
}]
}
答案 1 :(得分:-3)
快速而又脏的修复方法是使用$ timeout:
va.controller('OverviewCtrl',function($scope,$http,shipment, $timeout){
$timeout(function(){$scope.allShipments = shipment.allShipments}, 1000);
});