2015-11-04 3 views
1

Я хочу отфильтровать таблицу в соответствии с критериями, выбранными в раскрывающемся списке. Запись val в функции newList не фильтрует таблицу. Любые предложения, как пройти через это.Динамически установить фильтр в angularjs

  • HTML

    <tbody> 
    
        <tr ng-repeat="friendObj in newfriends"> 
    
        <td>{{friendObj.name}}</td> 
    
        <td>{{friendObj.phone}}</td> 
    
        <td>{{friendObj.age}}</td> 
        </tr> 
    
    </tbody> 
    

    • JS

      $scope.newList = function (val) { 
           alert(val); 
      $scope.newfriends = $filter('filter')($scope.friends, { 
          val: $scope.searcha 
      }) 
      
+0

Ссылка Plunkr: http://plnkr.co/edit/3yOmiIJ9Yu9RfAgmuVA7 –

+0

Если вы создаете подходящую модель поиска, например search.name, вам не нужно использовать '$ filter' в вашем контроле Пожалуйста, проверьте мой ответ. – Reza

ответ

1

В соответствии с вашим кодом, вы пытаетесь добавить критерии несколько раз, то вы хотите отфильтровать с этими критериями.

Здесь, в вашем JSON, всего 3 объекта. {имя, телефон и возраст}.

Таким образом, ваши критерии не должны превышать 3 ряда, и он не должен иметь одну и ту же вещь дважды. Если вы это сделаете, вам нужно создать собственный фильтр. Используйте следующий код

$scope.newList = function() { 
    var searchBy = {}; 
    angular.forEach($scope.newCriteria, function(criteria, key) { 
    searchBy[criteria.name] = criteria.value; 
    }); 
    $scope.newfriends = $filter('filter')($scope.friends, searchBy); 
} 

И Html следующим

<div id="searchy"> 

<ul class="list-unstyled"> 
    <li style="display: inline-block" ng-repeat="crtia in newCriteria"> 
    <table> 
     <tr> 

     <td> 
      <select ng-model="crtia.name" ng-options="searchopt for searchopt in searchcriteria " ng-click="searchy.check()"></select> 
     </td> 
     <td> 
      <input ng-model="crtia.value" placeholder="{{crtia.name}}" ng-change="newList()" /> 
     </td> 

     </tr> 
    </table> 
    </li> 
</ul> <button ng-click="searchy.generate()">Add Criteria</button> </div> 

Вот обновленный plunker. http://plnkr.co/edit/r5OcI366dyvLQ24fFIje?p=preview.

+0

searchBy [value.name] = value.value; Можете ли вы рассказать мне, что делает это заявление –

+0

newCriteria - это ваш массив критериев, который содержит несколько объектов {name, value}. При применении фильтра вам нужно построить такой объект, как {age: 18}. Где возраст - это имя вашего критерия, а значение 18. Так я и сделал. searchBy [значение.name] = значение.значение. [Здесь первое значение - это каждый экземпляр newCriteria], а второе значение - 18 (введен пользователем). Изменение образца кода для лучшего понимания. –

0

Возможно, вы хотите, чтобы фильтровать на основе выбора ниспадающего, а затем создать правильную модель поиска, как

<select ng-model="selectedsearchcriteria" 
     ng-options="searchopt for searchopt in searchcriteria "></select> 

<!--When you select dropdown 'selectedsearchcriteria' update like 'name', 'age' and so on 
then ng-model="search[selectedsearchcriteria]" forms like search.name, search.age and so on--> 
<input name="search" ng-model="search[selectedsearchcriteria]" placeholder="{{selectedsearchcriteria}}" /> 

<!--Here 'filter:search:strict' filter like search.name it is like property based filter--> 

<tr ng-repeat="friendObj in newfriends |filter:search:strict"> 

Также я думаю, что вам не нужно использовать $filter('filter') в контроллере

Проверить update plunker

+0

На самом деле мне пришлось фильтровать в контроллере –

+0

Но код внутри '$ scope.newList = function()', который вы написали, может быть достигнут без фильтрации в контроллере. Если вы хотите показать уже выбранный фильтр, используйте объект 'search'. – Reza