2012-08-01 251 views
96

是否可以將參數傳遞給過濾器函數,以便可以按任何名稱進行過濾?將參數傳遞給angularjs過濾器

喜歡的東西

$scope.weDontLike = function(item, name) { 
    console.log(arguments); 
    return item.name != name; 
}; 

回答

209

其實還有另外一個(也許更好的解決方案),您可以使用角度的本地「過濾器」過濾器,並且仍然將參數傳遞給你的定製過濾器。

考慮下面的代碼:

<div ng-repeat="group in groups"> 
    <li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)"> 
     <span>{{friend.name}}</span> 
    <li> 
</div> 

爲了使這項工作,你只是定義過濾器,如下所示:

$scope.weDontLike = function(name) { 
    return function(friend) { 
     return friend.name != name; 
    } 
} 

正如你可以在這裏看到,weDontLike實際上返回它還有另外一個功能,您參數在其範圍內以及來自過濾器的原始項目。

我花了2天才意識到你可以做到這一點,還沒有看到任何地方的解決方案。

結帳Reverse polarity of an angular.js filter瞭解如何將其用於過濾器的其他有用操作。

+13

這實際上應該被接受,這是OP的問題的一個解決方案。尼斯一個不錯的人! – ChrisR 2013-11-28 13:42:51

+0

如果您的過濾器需要多個參數,請參見[如何使用多個參數調用Angular.js過濾器?](http://stackoverflow.com/questions/16227325/how-do-i-call-an-angular- js-filter-with-multiple-arguments) – nh2 2014-02-27 15:24:24

+0

同意,這應該是選擇的解決方案。十分優雅! – JSancho 2014-10-17 12:20:13

76

從我的理解(使用「過濾器」過濾器時),你不能傳遞一個參數的過濾功能。你必須做的是寫一個自定義過濾器,某事像這樣:

.filter('weDontLike', function(){ 

return function(items, name){ 

    var arrayToReturn = [];   
    for (var i=0; i<items.length; i++){ 
     if (items[i].name != name) { 
      arrayToReturn.push(items[i]); 
     } 
    } 

    return arrayToReturn; 
}; 

這裏是工作的jsfiddle:http://jsfiddle.net/pkozlowski_opensource/myr4a/1/

其他簡單的替代,而無需編寫自定義過濾器是一個名字存儲篩選出的範圍,然後寫:

$scope.weDontLike = function(item) { 
    return item.name != $scope.name; 
}; 
+0

這是完美的感謝!在範圍中存儲名稱將不會如我所見,在同一頁面上具有來自同一數據的三個列表,即使用不同的狀態(或名稱)進行過濾。 – shapeshifter 2012-08-01 07:03:36

+0

任何設置'亞當'(指您的JSFiddle)動態?這似乎是不可能的(我想這是故意的)將ngModel和Angular中的自定義過濾器結合起來... – Rolf 2013-04-20 21:34:17

+0

是否可以重新排序過濾器的參數?例如,將項目傳遞給過濾器的第二個參數? – Pooya 2014-12-24 13:11:41

61

其實你可以傳遞參數(http://docs.angularjs.org/api/ng.filter:filter),不需要只爲這一個自定義的功能。如果你重寫你的HTML如下它會工作:

<div ng:app> 
<div ng-controller="HelloCntl"> 
<ul> 
    <li ng-repeat="friend in friends | filter:{name:'!Adam'}"> 
     <span>{{friend.name}}</span> 
     <span>{{friend.phone}}</span> 
    </li> 
</ul> 
</div> 
</div> 

http://jsfiddle.net/ZfGx4/59/

+8

是的。附註 - 如果某人的名字是'!Adam',你可以像{name:'!! Adam'}那樣得到他。 – honzajde 2013-03-10 00:21:52

+5

你也可以在這裏傳遞數組,像這樣'filter:['Adam','john']' – iConnor 2013-08-11 23:12:07

+6

jsfiddle鏈接被破壞。 – Seregwethrin 2014-01-27 13:35:28

2

擴展上pkozlowski.opensource's answer和使用javascript array's內置過濾方法的美化解決方案是這樣的:

.filter('weDontLike', function(){ 
    return function(items, name){ 
     return items.filter(function(item) { 
      return item.name != name; 
     }); 
    }; 
}); 

這裏的的jsfiddle link

更多關於陣列過濾器here

23

你可以簡單地做這樣的 模板

<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span> 

在過濾器

angular.module("app") 
.filter("firstFiler",function(){ 

    console.log("filter loads"); 
    return function(items, firstArgument,secondArgument){ 
     console.log("item is ",items); // it is value upon which you have to filter 
     console.log("firstArgument is ",firstArgument); 
     console.log("secondArgument ",secondArgument); 

     return "hello"; 
    } 
    }); 
+1

簡單而簡單! – 2015-11-17 10:49:38

+1

我比其他技術更喜歡這種方法。 – Greg 2016-01-17 17:07:42

+1

這是正確的解決方案。 – Cam 2016-07-12 21:12:16

0

可以多個參數傳遞到角過濾!

定義我的角度應用程序,以及一個應用程序級的變量 -

var app = angular.module('filterApp',[]); 
app.value('test_obj', {'TEST' : 'test be check se'}); 

你的過濾器將是這樣的: -

app.filter('testFilter', [ 'test_obj', function(test_obj) { 
    function test_filter_function(key, dynamic_data) { 
     if(dynamic_data){ 
     var temp = test_obj[key]; 
     for(var property in dynamic_data){ 
      temp = temp.replace(property, dynamic_data[property]); 
     } 
     return temp; 
     } 
     else{ 
     return test_obj[key] || key; 
     } 

    } 
    test_filter_function.$stateful = true; 
    return test_filter_function; 
    }]); 

而且從HTML,你會發送類似的數據: -

<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span> 

在這裏,我發送一個JSON對象到過濾器。 您也可以發送任何類型的數據,如字符串或數字。

,你也可以通過動態數量的參數中,你必須使用參數得到這些參數的話來過濾, 。

對於工作演示去這裏 - passing multiple arguments to angular filter

相關問題