【问题标题】:Angular resolve not working as expected on refresh角度解析在刷新时无法按预期工作
【发布时间】:2013-11-07 00:35:53
【问题描述】:

我希望我的 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

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

如何防止这种行为?

【问题讨论】:

    标签: javascript angularjs promise


    【解决方案1】:

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

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

    例如:

    resolve: {
      shipments: ['$q', function($q){
         var deffered = $q.defer();
    
         shipment.fetchAllShipments().then(function(res){
            deffered.resolve(res);
         });
    
         return deffered.promise;
      }]
    }
    

    【讨论】:

    • 那你怎么称呼它?
    【解决方案2】:

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

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

    【讨论】:

    • 当然可以。但是,resolve 不应该避免确切的黑客攻击吗?另外,我不能确保 1 秒总是足以等待承诺
    • 没有注意到承诺是问题所在。在这种情况下,您应该从服务返回承诺,然后在控制器中解决它。签出:stackoverflow.com/questions/18477711/…
    猜你喜欢
    • 2019-02-06
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多