Angularjs ng-повторение с объектом области фильтра

#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 при изменении