2017-01-19 21 views
1

私はフィルターパラメーターで配列を設定する方法は?

var companies = [ 
    { 
     id:1, 
     members : ['alex', 'john','nick'] 
    }, 
    { 
     id:2, 
     members : ['alex', 'john','nick'] 
    }, 
    { 
     id:3, 
     members : ['alex'] 
    }, 
    { 
     id:3, 
     members : ['nick'] 
    } 
] 

<div ng-repeat="item in companies | filter:itemFilter track by item._id "></div> 

次のリストを持っている私は、フィルタに次のパラメータを渡したい:

scope.itemFilter = {members: ['john','nick'] 

をしかし、それは動作しません。 どうすればよいですか?

scope.itemFilter = function(value /*, index, array*/){ 
    return (value.members.indexOf("john") >= 0 || value.members.indexOf("nick") >= 0); 
}; 

https://docs.angularjs.org/api/ng/filter/filter

答えて

0

あなたは、パラメータとして置く表現も機能することができます。

コントローラー:

$scope.names = ['john','nick']; 

フィルタ:

(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .filter('nameFilter', nameFilter); 

    function nameFilter() { 
     return nameFilter; 

     function nameFilter(list, names) { 
      var checkName = function (arr) { 
       var members = names; 
       members.map(function (val) { 
        if (arr.indexOf(val) !== -1) return true; 
       }); 
       return false; 
      } 
      return list.filter(checkName) 
     } 
    } 
})(); 

ビュー:

<div ng-repeat="item in companies | nameFilter(names) track by item._id "></div> 
0

あなたはあなたの要件のために新しいフィルタを作成することができます。

0

あなたが動的にフィルタを設定したい場合は、

app.filter('expenditurePayeeFilter', [ 
    function($filter) { 
    return function(inputArray, searchArray) { 
     if (!angular.isDefined(searchArray) || searchArray.length == 0) { 
     return inputArray; 
     } 
     var data = []; 
     var arrayContains = function(arr,sub) { 
     var self = this; 
     var result = sub.filter(function(item) { 
      return arr.indexOf(item) > -1; 
     }); 
     return sub.length === result.length; 
     } 
     angular.forEach(inputArray, function(item) { 
     if(arrayContains(item.members,searchArray)) 
      data.push(item); 
     }); 
     return data; 
    }; 
    } 
]); 
サブアレイが含まれているかどうかを

この機能チェックは/メインアレイに含ま

var arrayContains = function(arr,sub) { 
    var self = this; 
    var result = sub.filter(function(item) { 
     return arr.indexOf(item) > -1; 
    }); 
    return sub.length === result.length; 
    } 

var app = angular.module("app", []); 
 
app.filter('expenditurePayeeFilter', [ 
 
    function($filter) { 
 
    return function(inputArray, searchArray) { 
 
     if (!angular.isDefined(searchArray) || searchArray.length == 0) { 
 
     return inputArray; 
 
     } 
 
     var data = []; 
 
     var arrayContains = function(arr,sub) { 
 
     var self = this; 
 
     var result = sub.filter(function(item) { 
 
      return arr.indexOf(item) > -1; 
 
     }); 
 
     return sub.length === result.length; 
 
     } 
 
     angular.forEach(inputArray, function(item) { 
 
     if(arrayContains(item.members,searchArray)) 
 
      data.push(item); 
 
     }); 
 
     return data; 
 
    }; 
 
    } 
 
]); 
 
app.controller("ctrl", function($scope) { 
 
    $scope.itemFilter = ['john', 'nick']; 
 
    $scope.companies = [{ 
 
    id: 1, 
 
    members: ['alex', 'john', 'nick'] 
 
    }, { 
 
    id: 2, 
 
    members: ['alex', 'john', 'nick'] 
 
    }, { 
 
    id: 3, 
 
    members: ['alex'] 
 
    }, { 
 
    id: 3, 
 
    members: ['nick'] 
 
    }] 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="ctrl"> 
 
    <div ng-repeat="item in companies | expenditurePayeeFilter:itemFilter"> 
 
    {{item.id}}::{{item.members}} 
 
    </div> 
 
</div>

関連する問題