Herhangi bir ada göre filtreleyebilmeniz için filtre işlevine bir argüman iletmek mümkün mü?
Gibi bir şey
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Herhangi bir ada göre filtreleyebilmeniz için filtre işlevine bir argüman iletmek mümkün mü?
Gibi bir şey
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Yanıtlar:
Aslında, açının yerel 'filtre' filtresini kullanabileceğiniz ve yine de özel filtrenize argümanlar iletebileceğiniz başka (belki daha iyi bir çözüm) vardır.
Aşağıdaki kodu göz önünde bulundurun:
<div ng-repeat="group in groups">
<li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
<span>{{friend.name}}</span>
<li>
</div>
Bunun çalışması için filtrenizi aşağıdaki gibi tanımlamanız yeterlidir:
$scope.weDontLike = function(name) {
return function(friend) {
return friend.name != name;
}
}
Burada görebileceğiniz gibi, weDontLike aslında kendi kapsamında parametrenize ve filtreden gelen orijinal öğeye sahip başka bir işlevi döndürür.
Bunu yapabileceğinizi anlamam 2 günümü aldı, henüz bu çözümü hiçbir yerde görmedim.
Kontrol Et Bir angular.js filtresinin ters polaritesini filtreyle diğer yararlı işlemler için nasıl kullanabileceğinizi görmek için.
Anladığım kadarıyla, bir filtre işlevine bir argüman geçiremezsiniz ('filtre' filtresini kullanırken). Yapmanız gereken şey, şuna benzer bir özel filtre yazmaktır:
.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;
};
İşte çalışan jsFiddle: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/
Özel filtreler yazmadan diğer basit alternatif, bir kapsamda filtrelemek için bir ad saklamak ve ardından şunu yazmaktır:
$scope.weDontLike = function(item) {
return item.name != $scope.name;
};
Aslında bir parametre ( http://docs.angularjs.org/api/ng.filter:filter ) iletebilir ve sadece bunun için özel bir işleve ihtiyacınız yoktur. HTML'nizi aşağıdaki gibi yeniden yazarsanız çalışacaktır:
<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>
filter:['Adam', 'john']
Basitçe bunu Şablonda yapabilirsiniz
<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>
Filtrede
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";
}
});
Pkozlowski.opensource'un cevabını genişletmek ve javascript array's
yerleşik filtre yöntemini kullanmak güzel bir çözüm olabilir:
.filter('weDontLike', function(){
return function(items, name){
return items.filter(function(item) {
return item.name != name;
});
};
});
İşte jsfiddle bağlantısı .
Dizi filtresi hakkında daha fazla bilgiyi burada bulabilirsiniz .
Açısal filtreye birden fazla argüman iletebilirsiniz!
Açısal uygulamamı ve uygulama düzeyinde bir değişkeni tanımlama -
var app = angular.module('filterApp',[]);
app.value('test_obj', {'TEST' : 'test be check se'});
Filtreniz şöyle olacaktır: -
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;
}]);
Ve HTML'den aşağıdaki gibi veriler göndereceksiniz: -
<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span>
Burada filtreye bir JSON nesnesi gönderiyorum. Ayrıca dize veya numara gibi her türlü veriyi gönderebilirsiniz.
Ayrıca filtrelemek için dinamik sayıda argüman iletebilirsiniz, bu durumda bu argümanları almak için argümanlar kullanmanız gerekir.
Çalışan bir demo için buraya gidin - birden çok argümanı açısal filtreye geçirmek
Sadece kullanabilirsin | filter:yourFunction:arg
<div ng-repeat="group in groups | filter:weDontLike:group">...</div>
Ve js'de
$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group
}