Фильтр с переключателями с разными значениями (AngularJS)? - PullRequest
0 голосов
/ 07 октября 2018

У меня есть список элементов, которые я хочу отфильтровать с помощью переключателей, вот пример моего массива:

$scope.items = [
  {
    "name":"person 1",
    "section":"one",
    "job":false
  },
  {
    "name":"person 2",
    "section":"two",
    "job":true
  },
  {
    "name":"person 3",
    "section":"one",
    "job":false
  },
  {
    "name":"person 4",
    "section":"one",
    "job":true
  }
];

В моем HTML у меня есть ng-repeat список, который я хочу отфильтровать с помощью радиокнопок :

<div class="menu">
   <label>
      <input type="radio" ng-model="filteradio.section" value="">
      <p>All</p>
   </label>

   <label>
      <input type="radio" ng-model="filteradio.section" value="one">
      <p>Section 1</p>
   </label>

   <label>
      <input type="radio" ng-model="filteradio.section" value="two">
      <p>Section 2</p>
   </label>

   <label>
      <input type="radio" ng-model="filteradio.job" value="true">
      <p>People with job</p>
   </label>
</div>

<table>
   <tr>
      <td>Name</td>
      <td>Section</td>
      <td>Job</td>
   </tr>
   <tr ng-repeat="item in items | filter:filteradio:strict">
      <td>{{item.name}}</td>
      <td>{{item.section}}</td>
      <td ng-if="item.job">yes</td>
   </tr>
</table>

Проблема в том, что последняя радиокнопка не будет работать, поскольку при выборе кнопокс "filteradio.section" они работают нормально, но как только я нажимаю "filteradio.job" , остальные переключатели остаются отмеченными!
Я пытался добавить то же самое " name присваивать "всем переключателям, но таким образом, как только я нажимаю " filteradio.job " все элементы исчезают.
Как я могу отфильтровать их по" разделу ", а также по"есть ли у них работа или нет "?Есть ли более простой способ подойти к этому?

1 Ответ

0 голосов
/ 07 октября 2018

Ниже приведен рабочий пример, но я рассмотрю несколько примечательных моментов:

  • Все ваши радиовходы должны быть привязаны к одному и тому же ng-model, если параметры не взаимноисключительный, в противном случае вы можете оказаться в состояниях, в которых выбрано несколько радиовходов
  • Для реализации фильтрации вам нужно на таблице:
    • Отслеживать структуру фильтра, которая хранит свойство и значение элементадля фильтрации по
    • Используйте ng-change для обновления этой структуры фильтра при необходимости
    • Используйте специальный компаратор фильтра, который опирается на структуру фильтра
  • Takeобратите внимание, что некоторые радиовходы используют ng-value вместо value, последние значения всегда будут интерпретироваться как строковые литералы

angular
  .module('app', [])
  .controller('ctrl', function ($scope) {
    var radioFilter = {
      prop: 'section',
      value: null,
    };
    $scope.items = [
      {
        name: 'person 1',
        section: 'one',
        job: false,
      },
      {
        name: 'person 2',
        section: 'two',
        job: true,
      },
      {
        name: 'person 3',
        section: 'one',
        job: false,
      },
      {
        name: 'person 4',
        section: 'one',
        job: true,
      }
    ];
    $scope.radio = null;
    $scope.radioChanged = function (prop) {
      radioFilter = {
        prop: prop,
        value: $scope.radio,
      };
    };
    $scope.filterByRadio = function (item) {
      return $scope.radio === null || item[radioFilter.prop] === $scope.radio;
    };
  });
<div ng-app="app" ng-controller="ctrl">
  <div>
     <label>
        <input type="radio" ng-model="radio" ng-change="radioChanged('section')" ng-value="null"> All
     </label>
     <label>
        <input type="radio" ng-model="radio" ng-change="radioChanged('section')" value="one"> Section 1
     </label>
     <label>
        <input type="radio" ng-model="radio" ng-change="radioChanged('section')" value="two"> Section 2
     </label>
     <label>
        <input type="radio" ng-model="radio" ng-change="radioChanged('job')" ng-value="true"> People with job
     </label>
  </div>
  <table>
    <tr>
      <td>Name</td>
      <td>Section</td>
      <td>Job</td>
    </tr>
    <tr ng-repeat="item in items | filter:filterByRadio">
      <td>{{ item.name }}</td>
      <td>{{ item.section }}</td>
      <td>{{ item.job ? "yes" : "" }}</td>
    </tr>
  </table>
</div>
<script src="https://unpkg.com/angular@1.7.4/angular.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...