web-dev-qa-db-ja.com

anglejsフィルターに引数を渡す

任意の名前でフィルタリングできるように、引数をフィルター関数に渡すことは可能ですか?

何かのようなもの

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

実際には、角度のネイティブの「フィルター」フィルターを使用して、カスタムフィルターに引数を渡すことができる別の(おそらくより良いソリューション)があります。

次のコードを検討してください。

<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フィルターの逆極性 フィルターを使用する他の便利な操作でこれを使用する方法を確認します。

218
Denis Pshenov

私が理解していることから、引数をフィルター関数に渡すことはできません(「フィルター」フィルターを使用する場合)。あなたがしなければならないことは、次のようなカスタムフィルターを書くことです:

.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/

カスタムフィルターを作成せずに行うもう1つの簡単な代替方法は、スコープにフィルターアウトする名前を保存してから記述することです。

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

実際には、パラメーター( 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/

62
mikel

あなたは単にこのようにテンプレートで行うことができます

<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";
    }
    });
30
abhaygarg12493

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 です。

配列フィルターの詳細 こちら

2

angular filterに複数の引数を渡すことができます!

angularアプリとアプリレベル変数の定義-

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に渡すことができます。その場合は、argumentsを使用する必要がありますそれらの引数を取得します。

実用的なデモについては、こちらをご覧ください- 複数の引数をangularフィルターに渡す

0
Partha Roy