Angular.jsのカスタムフィルタを作成してみます。
文字列を反転して表示
入力した文字列を反転させて表示してみます。
HTML
<div ng-controller="ctrl">
<input type="text" name="test" ng-model="test">
<div>{{test | reverseFilter}}</div>
</div>
JavaScript
var app = angular.module('app', []);
app.filter('reverseFilter', [function () {
return function (test) {
return test.split('').reverse().join('');
};
}]);
app.controller('ctrl', function($scope) {
$scope.test= '';
});
複数項目での絞り込み検索
ng-repeatで表示している内容を、入力値やselectで絞り込んで表示してみます。
HTML
<div ng-controller="ctrl">
<input type="text" name="name" ng-model="name" placeholder="name">
<select name="category" ng-model="category" ng-options="category.value as category.name for category in categories">
<option value="">-----</option>
</select>
<select name="season" ng-model="season" ng-options="season.value as season.name for season in seasons">
<option value="">-----</option>
</select>
<ul>
<li ng-repeat="item in items | filter : originalFilter">
<p>{{item.name}}</p>
<div>
<span ng-repeat="season in item.season">{{season}} </span>
</div>
<p>{{item.category}}</p>
</li>
</ul>
</div>
JavaScript
var app = angular.module('app', []);
app.controller('ctrl', function($scope) {
$scope.name = '';
$scope.category = '';
$scope.season = '';
// カスタムフィルタの処理
$scope.originalFilter = function(value, index) {
// すべての入力値が空の場合はすべて表示する
if($scope.name === '' && $scope.category === '' && $scope.season === '') {
return true; // 表示
}
// 各入力値と比較して、表示するかどうかを保存しておく変数
var temp = {
'name': '',
'category': '',
'season': ''
}
// nameの判定
if($scope.name === '' || $scope.name === null) {
temp['name'] = true;
} else if(value.name.indexOf($scope.name) >= 0) {
temp['name'] = true;
} else {
temp['name'] = false;
}
// categoryの判定
if($scope.category === '' || $scope.category === null) {
temp['category'] = true;
} else if(value.category == $scope.category) {
temp['category'] = true;
} else {
temp['category'] = false;
}
// seasonの判定
if($scope.season === '' || $scope.season === null) {
temp['season'] = true;
} else {
// 配列なので各値と入力値を比較する
for (var i = 0; i < value.season.length; i++) {
// 一致する場合はtrueに入れてfor文を終了する
if(value.season[i] == $scope.season) {
temp['season'] = true;
break;
} else {
temp['season'] = false;
}
}
}
// 表示するかどうかの判定
if(temp['name'] && temp['category'] && temp['season']) {
return true; // 表示
} else {
return false; // 非表示
}
};
// ng-repeatで使用しているデータ
$scope.items = [
{
'name': 'SHIROBAKO',
'category': 'オリジナル',
'season': ['2014秋', '2015冬']
},
~ 略 ~
{
'name': 'Planetarian ~ちいさなほしのゆめ~',
'category': 'ゲーム',
'season': ['2016夏']
}
];
$scope.categories = [
{
'name': 'オリジナル',
'value': 'オリジナル'
},
~ 略 ~
{
'name': 'ゲーム',
'value': 'ゲーム'
}
];
$scope.seasons = [
{
'name': '2013秋',
'value': '2013秋'
},
~ 略 ~
{
'name': '2016夏',
'value': '2016夏'
}
];
});
各値を比較していって、一致する場合または値が空の倍はtrueになるようにしています。
複数項目での絞り込み検索のデモページ
【参考サイト】
- AngularJS: 配列の内容をフィルターするには?(filter) – Build Insider
- AngularJS: 自作の検索条件/比較ルールで配列を検索するには?(filter) – Build Insider
コメントが承認されるまで時間がかかります。