2017-02-20 6 views
0

Ich habe mit keinem Glück basteln, zuerst dachte ich, ich hätte es aber jetzt kann ich nicht die Ergebnisse mehrerer Filter konsistent zu erhalten.

Mein Problem ist, dass, wenn ich einen Filter auf dem Front-End auswähle, der erste, den ich benutze funktioniert, aber wenn ich dann einen zweiten Filter darüber, die filtered.length und die Anzahl der Seiten setzt, aber Die angezeigten Daten sind korrekt. Im Folgenden finden Sie, was in meinem Controller ist

$scope.list= response.data; 
     var memberList = $scope.list; 

     $scope.currentPage = 1; //current page 
     $scope.maxSize = 5; //pagination max size 
     $scope.entryLimit = 25; //max rows for data table 

     $scope.listLength = memberList.length; 
     $scope.noOfPages = 22; 


     $scope.$watch('filterA', 
      function(term) { 
       $scope.filtered = filterFilter($scope.list, term); 
       $scope.noOfPages = Math.ceil($scope.filtered.length/25); 
       $scope.listLength = $scope.filtered.length; 
     }, true); 
     $scope.$watch('filterB', 
      function(term) { 
       $scope.filtered = filterFilter($scope.list, term); 
       $scope.noOfPages = Math.ceil($scope.filtered.length/25); 
       $scope.listLength = $scope.filtered.length; 
     }, true); 
     $scope.$watch('filterC', 
      function(term) { 
       $scope.filtered = filterFilter($scope.list, term); 
       $scope.noOfPages = Math.ceil($scope.filtered.length/25); 
       $scope.listLength = $scope.filtered.length; 
     }, true); 
     $scope.$watch('filterD', 
      function(term) { 
       $scope.filtered = filterFilter($scope.list, term); 
       $scope.noOfPages = Math.ceil($scope.filtered.length/25); 
       $scope.listLength = $scope.filtered.length; 
     }, true); 

Und dann in der Ansicht, habe ich 4 Eingänge bekommt ... eine Suche ist, Dropdown die andere. Wenn ich mehr als einen Filter verwende, wird die Länge nicht aktualisiert.

<input type="text" ng-model="filterA"> 
<input type="text" ng-model="filterB"> 
<input type="text" ng-model="filterC"> 
<input type="text" ng-model="filterD"> 

{{filtered.length}} 
<uib-pagination total-items="filtered.length" items-per-page="25" next-text="Next" previous-text="Previous" ng-model="currentPage" max-size="maxSize" class="pagination-sm" boundary-link-numbers="true" boundary-links="true" num-pages="noOfPages"></uib-pagination> 
<table> 
    <tbody> 
     <tr ng-repeat="post in filtered | filterA | filterB | filterC | filterD | startFrom:(currentPage-1)*entryLimit | limitTo:entryLimit"> 
     <td>{{post.name}}</td> 
     </tr> 
    </tbody> 
    </table> 
+0

zeigen Sie mehr Code und lassen Sie uns wissen, wie Sie es in Front-End verwenden, so dass die Code auch –

Antwort

1

Hoffentlich, es ist ganz klar, was hier passiert. Jedes Mal, wenn einer Ihrer $watch-Ausdruck ausgelöst wird, wenden Sie den zuletzt geänderten Filter auf die ursprüngliche Liste an, so dass dies der einzige Effekt ist.

Wahrscheinlich sollten Sie alle vier Filter bei jeder Änderung anwenden. Hier ist eine Möglichkeit, dass Sie tun können:

function applyFilters() { 
    var filters = ['filterA', 'filterB', 'filterC', 'filterD']; 

    $scope.filtered = filters.reduce(function (l, name) { 
     return filterFilter(l, $scope[name]); 
    }, $scope.list); 
    $scope.noOfPages = Math.ceil($scope.filtered.length/25); 
    $scope.listLength = $scope.filtered.length; 
} 

$scope.$watch('filterA', applyFilters, true); 
$scope.$watch('filterB', applyFilters, true); 
$scope.$watch('filterC', applyFilters, true); 
$scope.$watch('filterD', applyFilters, true); 

Ich bin mir ziemlich sicher, dass Sie sollten auch die | filterA | filterB | filterC | filterD aus Ihrer Sicht entfernen. Wenn Sie Ihren Watch-Ausdruck bereits filtern, können diese nichts Nützliches tun.

+0

Vielen Dank, es funktioniert jetzt besser. Die Ergebnisse, die angezeigt werden, stimmen mit den angewendeten Filtern überein, aber was ist seltsam, dass die 'gefilterte.Länge' falsch ist? Wenn ich das 'gefilterte' Objekt überprüfe, hat es zu viele Werte ... aber dann zeigt das ng-repeat die richtigen Ergebnisse. Das ist verrückt nach mir! – TheIntrepidSpiff

+0

@TheIntrepidSpiff Ich habe Schwierigkeiten, mir vorzustellen, wie das möglich wäre. Sagen Sie, dass das "gefilterte" Objekt Werte hat, die nicht mit dem Filter übereinstimmen? Wie beobachtest du seine Länge? Ändert sich das überhaupt oder bleibt es bei einem festen Wert? – JLRishe

+0

@JLRrische: Danke für Ihre Hilfe! Ich habe es endlich funktioniert. Die Art und Weise, wie ich filterte, wurde nicht speziell auf den Schlüssel gefiltert, und es stellt sich heraus, dass die einzigartigen Dinge, die ich filterte, nicht so einzigartig waren und Konflikte mit anderen Feldern hatten. Dies hat die Zähler abgeworfen, wenn ich mehrere Filter verwendet habe. Nach der Aktualisierung zu Ihrem Vorschlag, musste ich meine Eingaben ändern, um auf das Feld zu filtern, indem Sie den Schlüssel 'field1' hinzufügen: und dann in meinem ng- wiederhole, um es zu ändern: '... | filter: filterA | ... 'für jeden der Filter – TheIntrepidSpiff

Verwandte Themen