#javascript #jquery #angularjs
#javascript #jquery — запрос #angularjs ( ангулярджс )
Вопрос:
У меня есть требование фильтровать строки в ng-repeat
на основе того, что в $scope.filterObject
. У меня есть данные в $scope.customerData
, которые содержат всю информацию о клиентах, но при циклическом просмотре каждого клиента я хотел бы показывать результаты только на основе того, что в $scope.filterObject
. Например, показывать только строки клиентов, у которых есть задания, находящиеся в $scope.filterObject
.
Вот ссылка на JSFiddle.
Вот что у меня есть на данный момент:
HTML:
<table ng-app="app" ng-controller="AppsCtrl">
<thead>
<tr>
<th> </th>
<th>Name</th>
<th>Email</th>
<th>DOB</th>
<th>Hobby</th>
</tr>
</thead>
<tbody ng-repeat="customer in customerData">
<tr>
<td><a href="#" class="main" ng-click="expandTable($event)"> </a></td>
<td>{{customer.name}}</td>
<td>{{customer.email}}</td>
<td>{{customer.DOB}}</td>
<td>{{customer.Hobby}}</td>
</tr>
<tr class="showhide">
<td> </td>
<td>Degree</td>
<td>{{customer.Degree}}</td>
<td>Job title</td>
<td>{{customer.Job}}</td>
</tr>
<tr class="showhide">
<td></td>
<td>Country</td>
<td>{{customer.Country}}</td>
<td>City</td>
<td>{{customer.City}}</td>
</tr>
</tbody>
</table>
JS:
// AngularJS toggle table
var app = angular.module('app', []);
app.controller('AppsCtrl', function($scope) {
$scope.expandTable = function() {
console.log($(event.target).closest('tr').nextUntil("tr.main"));
$(event.target).closest('tr').nextUntil("tr.main").slideToggle();
// console.log($(event.currentTarget).parent().parent());
}
var data = [{
"name": "John",
"email": "JSmith@yahoo.com",
"DOB": "01/05/1968",
"Degree": " BSC",
"Job": "Engineer",
"Hobby": "Football",
"Country": "US",
"City": "Houston"
}, {
"name": "Jessica",
"email": "Jess@yahoo.com",
"DOB": "03/05/1976",
"Degree": " Accounting",
"Job": "CPA",
"Hobby": "Video games",
"Country": "US",
"City": "Fredericks"
}, {
"name": "Andrew",
"email": "AJoan@yahoo.com",
"DOB": "06/12/1998",
"Degree": " PHD",
"Job": "Professor",
"Hobby": "Writing",
"Country": "US",
"City": "San Diago"
}, {
"name": "Rich",
"email": "Rschol@yahoo.com",
"DOB": "09/21/1988",
"Degree": " PHD",
"Job": "Technician",
"Hobby": "Writing",
"Country": "US",
"City": "San Diago"
}];
$scope.customerData = data;
$scope.filterObject = [{
"Job": "CPA"
}, {
"Job": "Engineer"
}]
});
Любое предложение и помощь действительно ценятся. 🙂
Ответ №1:
Вы можете использовать функцию angular filter в ng-repeat, чтобы сравнить customerArray с customerObject, а затем вернуть только тот элемент, который соответствует свойствам customerObject.
//Instead of array
$scope.filterObject = {
"Job": "CPA"
};
HTML :
<tr ng-repeat="customer in customerData | filter: filterObject">
В противном случае вы можете создать пользовательскую функцию фильтра для сравнения поля или массива полей :
app.filter('customerFilter', function() {
return function( items, filterParams) {
var filtered = [];
angular.forEach(items, function(item) {
if(filterParams.Job.indexOf(item.Job) !== -1) {
filtered.push(item);
}
});
return filtered;
};
});
HTML :
<tr ng-repeat="customer in customerData | customerFilter: filters">
Клиентский контролер:
$scope.filters = {
"Job" :["Technician","CPA"]
}
рабочий пример здесь : https://jsfiddle.net/Nedev_so/wb1hqeca /
Комментарии:
1. Недев, спасибо тебе за твой ответ. Я также рассмотрю пользовательские фильтры.
Ответ №2:
$scope.customerData = data.filter(function(user){
var found = false;
$scope.filterObject.forEach(function(filter){
if(filter.Job === user.Job)
found = true;
})
return found;
});
Скрипка: https://jsfiddle.net/nandorpersanyi/yLsxqkx8 /
Что касается ответа Недева: фильтры DOM могут влиять на производительность, предполагая, что мы обрабатываем большие наборы данных (например, в $scope.customerData тысячи клиентов). В этом случае вам лучше фильтровать внутри контроллера, если только вам не нужно взаимодействие пользователя с фильтром. И если ваш объект фильтра обновляется динамически, просто $ следите за изменениями, а затем повторно отображайте customerData при изменении