Wie verwende ich Parameter innerhalb des Filters in AngularJS?

73

Ich möchte Parameter im Filter verwenden, wenn ich einige Arrays mit ng-repeat iteriere

Beispiel:

HTML-Teil:

<tr ng-repeat="user in users | filter:isActive">

JavaScript-Teil:

$scope.isActive = function(user) {
    return user.active === "1";
};

Aber ich möchte in der Lage sein, Filter wie zu verwenden

<tr ng-repeat="user in users | filter:isStatus('4')">

Aber es funktioniert nicht. Wie kann ich so etwas machen?

Vural
quelle

Antworten:

122

UPDATE: Ich glaube , ich wirklich in der Dokumentation sah nicht gut genug , aber man kann auf jeden Fall das verwendet Filter mit dieser Syntax (siehe Filter diese Geige ) zum Filter durch eine Eigenschaft auf den Objekten:

<tr ng-repeat="user in users | filter:{status:4}">

Hier ist meine ursprüngliche Antwort für den Fall, dass es jemandem hilft:

Mit dem Filterfilter können Sie keinen Parameter übergeben, aber Sie können mindestens zwei Dinge tun.

1) Legen Sie die Daten, nach denen Sie filtern möchten, in einer Bereichsvariablen fest und verweisen Sie auf diese in Ihrer Filterfunktion wie diese Geige .

JavaScript:

$scope.status = 1;
$scope.users = [{name: 'first user', status: 1},
                {name: 'second user', status: 2},
                {name: 'third user', status: 3}];

$scope.isStatus = function(user){
    return (user.status == $scope.status);
};

Html:

<li ng-repeat="user in users | filter:isStatus">

ODER

2) Erstellen Sie einen neuen Filter, der einen Parameter wie diese Geige berücksichtigt .

JavaScript:

var myApp = angular.module('myApp', []);
myApp.filter('isStatus', function() {
  return function(input, status) {
    var out = [];
      for (var i = 0; i < input.length; i++){
          if(input[i].status == status)
              out.push(input[i]);
      }      
    return out;
  };
});

Html:

<li ng-repeat="user in users | isStatus:3">

Beachten Sie, dass dieser Filter davon ausgeht, dass statusdie Objekte im Array eine Eigenschaft enthalten, die sie möglicherweise weniger wiederverwendbar macht. Dies ist jedoch nur ein Beispiel. Sie können lesen , das auf die Schaffung von Filtern für weitere Informationen.

Gloopy
quelle
@ mcranston18 Die 3 Geigen, die ich verlinkt habe, funktionieren für mich in der neuesten Version von Chrome. Wo bricht es für dich?
Gloopy
Für 2) kann es hilfreich sein zu wissen, dass Sie Ihren benutzerdefinierten Filtern mehrere Argumente übergeben können , auch aus Vorlagen.
nh2
Was ist, wenn ich nach "Name" und "Status" filtern möchte? Der Benutzer kann den Namen ODER den Status in das Textfeld eingeben und möchte, dass er gefiltert wird. Gibt es eine Möglichkeit, Beispiel: Filter: {Status: 4, Name: Mark} "
iPhoneDev
50

Diese Frage ist fast identisch mit der Übergabe von Argumenten an AngularJS-Filter , auf die ich bereits eine Antwort gegeben habe. Aber ich werde hier noch eine Antwort posten, damit die Leute sie sehen.

Tatsächlich gibt es eine andere (möglicherweise bessere) Lösung, bei der Sie den nativen Filterfilter des Winkels verwenden und trotzdem Argumente an Ihren benutzerdefinierten Filter übergeben können.

Betrachten Sie den folgenden Code:

    <li ng-repeat="user in users | filter:byStatusId(3)">
        <span>{{user.name}}</span>
    <li>

Damit dies funktioniert, definieren Sie Ihren Filter einfach wie folgt:

$scope.byStatusId = function(statusId) {
    return function(user) {
        return user.status.id == statusId;
    }
}

Dieser Ansatz ist vielseitiger, da Sie Vergleiche mit Werten durchführen können, die tief im Objekt verschachtelt sind.

Kasse Verpolung eines Angular.js-Filters umkehren, um zu sehen, wie Sie dies für andere nützliche Operationen mit Filter verwenden können.

Denis Pshenov
quelle
Aus irgendeinem seltsamen Grund funktioniert das bei mir einfach nicht. Ich habe eine ng-repeat="a in array | filter: myFilterFunc">in der Ansicht. In der Steuerung, die ich habe $scope.myFilterFunc = function() {..}... funktioniert es einfach nicht.
Clev3r
Bitte schauen Sie sich meine Antwort genauer an, Ihr Filter muss eine Funktion wie in $scope.myFilterFunc = function() { return function(item) { // actual filter code goes here } }UND zurückgeben und Sie müssen Filter als Funktion aufrufen, wiefilter:myFilterFunc()
Denis Pshenov
1
@DenisPshenov was ist, wenn ich aund einen anderen Wert einschließen wollte ? <li ng-repeat="status in statuses | filter:currentStatus(status, scopevar.status)" ??? <- Das funktioniert nicht
Gaʀʀʏ
@Garry, Sie müssten dann nach diesem anderen Wert in Ihrem Filter wie anfordern $scope.currentStatus = function(status, otherValue) { ... }. Meinst Du das?
Denis Pshenov
@DenisPshenov Das Problem, das ich hatte, war die Sichtbarkeit statusbei der Verwendung einer zusätzlichen Variablen. Ich habe einen anderen Ansatz mit ng-modelundng-options
Gaʀʀʏ
1

Wenn Sie einen benutzerdefinierten AngularJs-Filter erstellt haben, können Sie mehrere Parameter an Ihren Filter senden. Hier wird die Verwendung in der Vorlage verwendet

{{ variable | myFilter:arg1:arg2...  }}

Wenn Sie Filter in Ihrem Controller verwenden, können Sie dies folgendermaßen tun

angular.module('MyModule').controller('MyCtrl',function($scope, $filter){
    $filter('MyFilter')(arg1, arg2, ...);
})

Wenn Sie mehr mit Beispielen und Online-Demo benötigen, können Sie diese verwenden

AngularJs filtert Beispiele und Demos

Hazarapet Tunanyan
quelle
0

Beispiel Ich habe eine Studentenliste wie folgt:

$scope.students = [  
   { name: 'Hai', age: 25, gender: 'boy' },  
   { name: 'Hai', age: 30, gender: 'girl' },  
   { name: 'Ho', age: 25, gender: 'boy' },  
   { name: 'Hoan', age: 40, gender: 'girl' },  
   { name: 'Hieu', age: 25, gender: 'boy' }  
 ];  

Ich möchte Schüler nach Geschlecht filtern, um ein Junge zu sein, und nach ihrem Namen filtern.

Das erste Mal erstelle ich eine Funktion namens "filterbyboy" wie folgt:

$scope.filterbyboy = function (genderstr) {  
   if ((typeof $scope.search === 'undefined')||($scope.search === ''))  
     return (genderstr = "")  
   else  
    return (genderstr = "boy");  
 };  

Erklärung: Wenn der Name nicht gefiltert wird, werden alle anderen Schüler nach Eingabename und Geschlecht als "Junge" gefiltert.

Hier finden Sie den vollständigen HTML-Code und die Demo. Verwendung und Operator in AngularJs Beispiel

Lewis Hai
quelle