Angular JS предоставляет удобные возможности для фильтрации объектов в зависимости от значения либо самих объектов, либо их полей. В данном примере, мы будем фильтровать объекты по значению поля status. У нас будет checkbox, который будет определять, объекты с каикм значением поля status мы будем показывать. Если галочка стоит то значения -
["STARTED", "NOT_STARTED", "FINISHED"]
если галочка не стоит, то значения
["STARTED", "NOT_STARTED"]
Таблица объектов, в которой используется фильтр.
Использование фильтра.
Изначально показываем объекты у которых поле status имеет значение либо STARTED либо NOT_STARTED
Изначально не стоит галочка показывать объекты, у которых поле status имеет значение FINISHED
Обработчки нажатия на checkbox. Если ставим галочку, то добавляем в массив допустимых статусов статус FINISHED, если убираем галочку, то массив без статуса FINISHED
Непосредственно сам фильтер. Проверяем, если поле status объекта не входит в массив допустимых значений, то не возвращаем ничего. Если же входит то, возвращаем объект.
https://docs.angularjs.org/api/ng/filter/filter
https://docs.angularjs.org/guide/filter
http://stackoverflow.com/questions/15868248/how-to-filter-multiple-values-or-operation-in-angularjs
https://docs.angularjs.org/guide/filter#creating-custom-filters
http://jsfiddle.net/Xesued/Bw77D/7/
http://stackoverflow.com/questions/16227325/how-do-i-call-an-angular-js-filter-with-multiple-arguments
http://jsfiddle.net/65Pyj/
["STARTED", "NOT_STARTED", "FINISHED"]
если галочка не стоит, то значения
["STARTED", "NOT_STARTED"]
HTML Code
Checkbox показывать объекты со статусом FINISHED.<div class="col-lg-3 pull-right text-right"> <input type="checkbox" id="showFinishedCheckbox" ng-model="showFinished" ng-change="showFinishedClicked()"> <label for="showFinishedCheckbox">Show Finished Clients</label> </div>
<table class="table table-hover"> <thead> <th ng-repeat="item in head" ng-click="changeSorting(item.field)" class="sortable">{{item.title}} <span ng-show="displaySorting(item.field, false)">▼</span> <span ng-show="displaySorting(item.field, true)">▲</span> </th> </thead> <tbody> <tr ng-class="{active : selectedCampaign.id == c.id}" ng-repeat="c in campaigns | orderBy:sort.column:sort.descending | filter:query | filter:statusFilter" ng-click="selectCampaign(c)"> <td><a ng-click="editCampaign(c); $event.stopPropagation()" style="cursor:pointer;">{{c.title}}</a> </td> <td>{{c.campaignCode}}</td> <td>{{c.startDate | date:'mediumDate'}}</td> <td>{{c.endDate | date:'mediumDate'}}</td> <td>{{getStatus(c.status).name}}</td> </tr> </tbody> </table>
Использование фильтра.
<tr ng-class="{active : selectedCampaign.id == c.id}" ng-repeat="c in campaigns | orderBy:sort.column:sort.descending | filter:query | filter:statusFilter" ng-click="selectCampaign(c)">
CoffeScript Code
Изначально показываем объекты у которых поле status имеет значение либо STARTED либо NOT_STARTED
$scope.filteredStatuses = ["STARTED", "NOT_STARTED"]
Изначально не стоит галочка показывать объекты, у которых поле status имеет значение FINISHED
$scope.showFinished = false
Обработчки нажатия на checkbox. Если ставим галочку, то добавляем в массив допустимых статусов статус FINISHED, если убираем галочку, то массив без статуса FINISHED
$scope.showFinishedClicked = () -> if $scope.showFinished $scope.filteredStatuses = ["STARTED", "NOT_STARTED", "FINISHED"] else $scope.filteredStatuses = ["STARTED", "NOT_STARTED"] return
Непосредственно сам фильтер. Проверяем, если поле status объекта не входит в массив допустимых значений, то не возвращаем ничего. Если же входит то, возвращаем объект.
$scope.statusFilter = (campaign) -> if $scope.filteredStatuses.length > 0 if $.inArray(campaign.status, $scope.filteredStatuses) < 0 return return campaign
Источники
https://docs.angularjs.org/api/ng/filter/filter
https://docs.angularjs.org/guide/filter
http://stackoverflow.com/questions/15868248/how-to-filter-multiple-values-or-operation-in-angularjs
https://docs.angularjs.org/guide/filter#creating-custom-filters
http://jsfiddle.net/Xesued/Bw77D/7/
http://stackoverflow.com/questions/16227325/how-do-i-call-an-angular-js-filter-with-multiple-arguments
http://jsfiddle.net/65Pyj/