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

更新(正解)

Promise は、設計上、一度しか解決できません。その結果、new ngTableParams内にネスト$scope.data.$promise.then(function (data) {すると、後でデータを更新する機能が制限されます。

代わりに、コールバックを関数内に配置して、を呼び出す前に新しい promise でgetDataリセットできるようにします。$scope.data$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();
};

前の回答 (不正解)

ClientService非同期呼び出し (クエリ)の後に同期関数呼び出し (ngTable の更新) があります。そのため、データが返される前にテーブルの更新が実行されます。

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 に答える