フィルタ関数に引数を渡して、任意の名前でフィルタリングできるようにすることはできますか?
何かのようなもの
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
フィルタ関数に引数を渡して、任意の名前でフィルタリングできるようにすることはできますか?
何かのようなもの
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
実際には、Angularのネイティブの「フィルター」フィルターを使用しても、カスタムフィルターに引数を渡すことができる別の(おそらくより良い解決策)があります。
次のコードを検討してください。
<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日かかりましたが、この解決策はまだどこにも見られませんでした。
フィルターのその他の便利な操作にこれをどのように使用できるかを確認するには、 angular.jsフィルターの逆極性を確認してください。
私が理解していることから、('filter'フィルターを使用している場合)フィルター関数に引数を渡すことはできません。あなたがしなければならないことは、次のようなカスタムフィルターを書くことです:
.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;
};
実際には、パラメーター(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>
テンプレートでこのように簡単に行うことができます
<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";
}
});
pkozlowski.opensourceの回答を拡張し、javascriptのarray's
組み込みフィルターメソッドを使用すると、次のような適切なソリューションが得られます。
.filter('weDontLike', function(){
return function(items, name){
return items.filter(function(item) {
return item.name != name;
});
};
});
これがjsfiddleリンクです。
配列フィルターの詳細については、こちらをご覧ください。
角度フィルターに複数の引数を渡すことができます!
角度のあるアプリとアプリレベル変数の定義-
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オブジェクトをフィルターに送信しています。文字列や数値など、あらゆる種類のデータを送信することもできます。
また、動的な数の引数をフィルターに渡すことができます。その場合、引数を使用してそれらの引数を取得する必要があります。
動作するデモについては、ここにアクセスしてください- 角度フィルターに複数の引数を渡します
簡単に使用できます | filter:yourFunction:arg
<div ng-repeat="group in groups | filter:weDontLike:group">...</div>
そしてjsで
$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group
}