2013-04-22 3 views
31

私は既にページネーションを実装しています。 結果をフィルタリングした後で、ページ番号を更新したいと思います。フィルタリング後にAngularJSのページ分割を更新します

形態:

<input type="text" data-ng-model="search.name" data-ng-change="filter()"/> 

リスト:

<li data-ng-repeat="data in filtered = (list | filter:search) | filter:search | startFrom:(currentPage-1)*entryLimit | limitTo:entryLimit">{{data.name}}</li> 

ページネーション:

<pagination data-boundary-links="true" data-num-pages="noOfPages" data-current-page="currentPage" max-size="maxSize"></pagination> 

コントローラ:

$scope.filter = function() { 
    window.setTimeout(function() { //wait for 'filtered' to be changed 
     $scope.noOfPages = Math.ceil($scope.filtered.length/$scope.entryLimit); 
     $scope.setPage = function(pageNo) { 
      $scope.currentPage = pageNo; 
     }; 
    }, 10); 
}; 

私の問題は、ページ番号をクリックした後、または入力フィールドに次の文字を入力した後でページ番号が更新されたことだけです。だから遅くまで一歩進んでいます。

EDIThttp://jsfiddle.net/eqCWL/2/

答えて

3

利用$timeout代わりのwindow.setTimeOut:私はjsFiddleにソースを追加しました。 $timeoutは、角度で一貫して動作するように正しくラップされます。

35

@abject_errorの回答は$timeoutを使用しています。私は彼の提案であなたのフィドルを編集し、私は解決策は、競合状態の形での大きな問題の指標であると考え、このjsFiddle

CAVEAT

を作りましたよ!

jsFiddle using filterFilter and $watch

とそのフィドルは実数のため、それを回避する方法です。

そしてここでは、あなたの競合状態がsearchの変化と$scope.filteredの可用性を扱うとの間にある説明

です。

私はこの競合状態を解決するために排除するために犯人がいると思う

noOfPagesの計算を行うためにオフに解雇するng-changeを使用し

ng-model="search" ng-change="filter()" 

ng-repeat="data in filtered = (list | filter:search)......." 

「フィルタを()」 filteredを作成するための検索の変更にも依存します。このようにすると、フィルタリングされたリストがページ数を計算するために準備ができていない可能性があります。そのため、10msごとに "filter()"をホールドしてタイムアウトにすると、

searchの変更を「監視」し、$scope.filteredを作成して$scope.noOfPagesを計算するアクセス権を持つ場所でリストをフィルタリングする方法です。すべて順番に、レースなし。

角度がありますように!コントローラのfilterフィルタは、機能が非常に悪いので、filterFilterという名前で使用することができます。これをチェックしてくださいFilters Guide - Using filters in controllers and services

コントローラに注入してください。

function pageCtrl($scope, filterFilter) { 
    // ... 
} 

scopes docs

$scope.$watch('search', function(term) { 
    // Create filtered 
    $scope.filtered = filterFilter($scope.list, term); 

    // Then calculate noOfPages 
    $scope.noOfPages = Math.ceil($scope.filtered.length/$scope.entryLimit); 
}) 

変更私たちの新しい方法を反映するためのテンプレートに記載さ$watch機能、それを使用してください。これ以上のDOMフィルタ、またはng-change

<input type="text" ng-model="search" placeholder="Search"/> 

<li ng-repeat="data in filtered | startFrom:(currentPage-1)*entryLimit | limitTo:entryLimit"> 
    {{data.name}} 
</li> 
+0

これはより良い解決策のように見えますが、ng-model = "search"をng-model "search.name"に変更すると、それは壊れそうです。これが原因です。私は複数の列をフィルタリングできるようにしたいので、これを求めています – Gabe

+3

watch式を 'search.name'にも変更します。 $ watchCollectionがあなたの場合に使用するものであるかどうかを検討したいかもしれません。オブジェクトのプロパティを見ることができます。 – nackjicholson

+0

私はすでに$ watch関数の3番目のパラメータを知っていましたが、$ watchCollectionがさらに優れていると思います。ありがとうございました。 – Gabe

関連する問題