如何在AngularJS的过滤器中使用参数?


73

当我用ng-repeat迭代一些数组时,我想在过滤器中使用参数

例:

HTML部分:

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

JavaScript部分:

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

但是我希望能够使用像

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

但是它不起作用。我该怎么做?

Answers:


122

更新:我想我对文档的了解并不足够,但是您绝对可以使用具有以下语法的过滤过滤器(请参阅此小提琴)来按对象的属性过滤:

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

如果有帮助,这是我的原始答案:

使用过滤过滤器将无法传递参数,但是至少可以做两件事。

1)在范围变量中设置要过滤的数据,并在您的过滤器函数中引用该数据,例如fiddle

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">

要么

2)创建一个新的过滤器,该过滤器接受一个类似fiddle的参数。

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">

请注意,此过滤器假定status数组中的对象中有一个属性,这可能会使它的可重用性降低,但这只是一个示例。您可以阅读此内容以获取有关创建过滤器的更多信息。


@ mcranston18我链接的3个小提琴在最新版本的Chrome中为我工作。它在哪里为您打破?
Gloopy

对于2),知道可以将多个参数传递到自定义过滤器(甚至从模板)也可能很有用。
nh2 2014年

如果我想同时过滤“名称”​​和“状态”怎么办?用户可以在文本框中输入名称或状态,我希望它进行过滤。有什么办法吗,例如:过滤器:{状态:4,名称:马克}”
iPhoneDev

50

这个问题几乎与将参数传递给angularjs过滤器相同,我已经给出了答案。但是我要在这里再发布一个答案,以便人们看到。

实际上,还有另一种(也许是更好的解决方案),您可以使用angular的本机“过滤器”过滤器,并且仍将参数传递给自定义过滤器。

考虑以下代码:

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

要进行此工作,您只需将过滤器定义如下:

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

这种方法用途更广,因为您可以对嵌套在对象内部的值进行比较。

检出angular.js过滤器的反极性,以了解如何将其用于过滤器的其他有用操作。


由于某些奇怪的原因,这对我不起作用。我ng-repeat="a in array | filter: myFilterFunc">认为。在控制器中,我$scope.myFilterFunc = function() {..}...只是不起作用。
Clev3r

请仔细看看我的回答,您的过滤器必须返回函数,$scope.myFilterFunc = function() { return function(item) { // actual filter code goes here } }并且必须将过滤器作为函数调用,例如filter:myFilterFunc()
Denis Pshenov

1
@DenisPshenov如果我想包含a另一个值,该怎么办?<li ng-repeat="status in statuses | filter:currentStatus(status, scopevar.status)" ??? < -这不起作用
Gaʀʀʏ

@Garry,然后您需要在过滤器中请求该其他值,例如$scope.currentStatus = function(status, otherValue) { ... }。你是这个意思吗?
丹尼斯·普谢诺夫

@DenisPshenov我遇到的问题是status使用其他变量时的可见性。我使用了ng-modelng-options
Ga

1

如果创建了AngularJs自定义过滤器,则可以向过滤器发送多个参数。

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

如果您在控制器内部使用过滤器,则可以执行以下操作

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

如果您需要更多示例和在线演示,可以使用此功能

AngularJs过滤器示例和演示



0

例子我有一个学生名单如下:

$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' }  
 ];  

我想按性别筛选要成为男孩的学生,并按其姓名进行筛选。

首先,我创建一个名为“ filterbyboy”的函数,如下所示:

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

说明:如果不是过滤器名称,则显示所有其他学生,并按输入名称和性别将过滤器显示为“ boy”

这是完整的HTMLcode和演示AngularJs示例中的使用方法和运算符

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.