使用ngGrid和OAuth刷新令牌时出现的问题

时间:2015-02-24 12:33:00

标签: angularjs ng-grid

在我的Angular SPA应用程序中使用ng-grid 2.0.7和OAuth2刷新令牌时遇到了一个非常烦人的问题。

我的应用程序使用OAuth2在登录时生成身份验证令牌,每次令牌过期时都会生成HTTP 401错误。然后,我有 一个AngularJS响应拦截器,它拦截HTTP 401错误并在再次重试先前的HTTP请求之前请求新的刷新令牌。现在,使用ng-grid时,所有这些在我的应用程序 EXCEPT 中都能很好地工作。

这是我的AngularJS控制器中的一部分代码导致我无法解决问题:

appModule.controller('orderBookController',
    ['$scope', '$timeout', 'orderList',
        function ($scope, $timeout, orderList) {

            $scope.orders = [];
            $scope.orderList = orderList;

            // get data asynchronously and return the list of orders via a promise. 
            self.getDataAsync = function () {
                $scope.orderList.getOrders()
                .then(function (data) {
                    // THIS BIT IS WHAT I AM HAVING PROBLEMS WITH.
                    // $scope.orders gets populated with new data, but
                    // doesn't appear in the grid at all.
                    $timeout(function () {
                        console.log($scope.$$phase);
                        console.log(data.orders);
                        $scope.orders = data.orders;
                    }, 3000);
                })
            };

            // load initial data.
            self.getDataAsync();

            // set up ng-grid
            $scope.orderData = {
                columnDefs: [
                    { field: 'orderRef', displayName: 'Order Ref', width: 75 },
                    { field: 'customerName', displayName: 'Customer Name' },
                ],
                multiSelect: false,
                headerRowHeight: 48,
                rowHeight: 30,
                showFooter: true,
                data: 'orders'
            };

        }
    ]);

问题是,当应用程序遇到401错误并且收到新的刷新令牌时,即使开发人员,ng-grid仍为空白 控制台日志清楚地显示REST后端发送的数据。如果我立即转到另一页然后返回网格刷新并显示数据,但如果我等到 令牌过期后,它不显示数据,网格仍为空白。

这让我想知道在$ digest周期中接收数据时是否存在ng-grid无法刷新的问题。我可以确认显示$scope.$$phase <{1}}正在执行时,在开发人员控制台中$digest

以前是否有人遇到过此问题,如何解决?

在最坏的情况下,我将不得不放弃ng-grid并使用SmartTable或滚动我自己的自定义网格。

1 个答案:

答案 0 :(得分:0)

在我意识到getOrders()方法落入error回调并因此拒绝回复后,我设法解决了我自己的问题。更改error回调后,它会deferred.resolved(self)对问题进行适当的整理。