0

我正在使用以下内容填充 ngTable,效果很好:

      $scope.data = ClientService.query(
        {
            state: $scope.currentStateId,
            parentId: $scope.parentId
        });

    $scope.data.$promise.then(function (data) {
        $scope.tableParams = new ngTableParams(
            {
                page: 1,                        // show first page
                count: $scope.pageCount,        // count per page
                sorting: { Name: 'asc' },
                filter: { Name: ''}
            },
            {
                total: data.length,
                getData: function ($defer, params) {
                    var orderedData = params.filter() ? $filter('filter')(data, params.filter()) : data;
                    orderedData = params.sorting() ? $filter('orderBy')(orderedData, params.orderBy()) : orderedData;
                    params.total(orderedData.length); // set total for recalc pagination

                    $scope.accounts = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count());
                    $defer.resolve($scope.accounts);
                }
            });
    });

我现在希望从设置新的 $scope.currentStateId 的 ng-change 事件中更新 ngTable,如下所示:

 $scope.stateChange = function () {
        //$state.go('root.account.clients.list', { state: $scope.currentStateId, parentId : $scope.parentId }, { reload : true })
        //var sel = $scope.currentStateId;
        $scope.data = ClientService.query(
            {
                state: $scope.currentStateId,
                parentId: $scope.parentId
            });
       $scope.tableParams.reload();
    };

ClientService.query 使用正确的参数访问服务器并返回正确的数据,但 ngTable 未更新。

有人可以帮忙吗。

4

1 回答 1

5

更新(正确答案)

按照设计,承诺只能解决一次。因此,嵌套new ngTableParams在内部会$scope.data.$promise.then(function (data) {限制您以后更新数据的能力。

相反,将回调放在getData函数内部,以便您可以$scope.data在调用之前使用新的 Promise重置$scope.tableParams.reload()

$scope.data = ClientService.query({
    ...
});

$scope.tableParams = new ngTableParams({                     
    ...
    getData: function ($defer, params) {
        $scope.data.$promise.then(function (data) {
            var orderedData = params.filter() ? $filter('filter')(data, params.filter()) : data;
            ...
            $defer.resolve($scope.accounts);
        });
    }
});

$scope.stateChange = function () {    
    $scope.data = ClientService.query({
        ...
    });

    $scope.tableParams.reload();
};

上一个答案(不正确)

在异步调用(查询)之后,您有一个同步函数调用(您的 ngTable 更新ClientService)。因此,表更新在数据返回之前执行。

将表更新调用包装在一旦 promise 被解决就会触发的回调中:

$scope.data = ClientService.query(
{
    state: $scope.currentStateId,
    parentId: $scope.parentId
});

$scope.data.$promise.then(function (data) {
    $scope.tableParams.reload();
};
于 2014-06-12T22:37:09.233 回答