Привязка условной модели в AngularJS на основе выпадающего списка

#javascript #angularjs #angularjs-filter

#javascript #angularjs #angularjs-фильтр

Вопрос:

Допустим, у меня есть выпадающий список, который привязан к свойству модели, которое будет проверяться для определения модели, которая будет привязана к моему текстовому полю.

 <select ng-model="searchType">
   <option value="Id">Id</option>
   <option value="Firstname">Firstname</option>
</select>
  

что бы ни выбрал пользователь, поиск будет основан на этом, и это может быть либо searchQuery.id searchQuery.Firstname

Он отображается следующим образом:

 <tr ng-repeat="user in users | orderBy:sortColumn:sortDescending | filter:searchQuery">
        <td>{{ user.Id }}</td>
        <td>{{ user.Firstname }}</td>
        <td>{{ user.LastName }}</td>
</tr>
  

Я пытался использовать код из аналогичной темы, в которой используется getter/setter , но, похоже, я не могу заставить его работать.

Как мне это сделать?

Ответ №1:

Вы можете быть search объектом внутри контроллера, $scope.search = {} а затем поместить объект поиска поверх этого фильтра.

 <select ng-model="searchType">
   <option value="Id">Id</option>
   <option value="Firstname">Firstname</option>
</select>
<input class="form-control" ng-model="search[searchType]" ng-disabled="!searchType.length"/>

<tr ng-repeat="user in users | orderBy:sortColumn:sortDescending | filter: search">
    <td>{{ user.Id }}</td>
    <td>{{ user.Firstname }}</td>
    <td>{{ user.LastName }}</td>
</tr>
  

Хотя вышеописанное будет работать, но если вы измените выпадающий список, теперь он будет работать по назначению. Так что очищайте search объект при изменении значения выпадающего списка. Чтобы поиск был более точным.

Демонстрационный Plunkr

Комментарии:

1. Сделал плунжер на основе этого хорошего ответа для целей тестирования: embed.plnkr.co/MDlUpFFRKxQRg7rCO61v

2. Ого! Я не знал об этом! Он также выполняет частичное сопоставление!

3. @NathanBeck спасибо за plunkr, в моем коде была небольшая ошибка, при изменении выпадающего search объекта сохранялось значение свойства. Итак, я понимаю, чем при изменении выпадающего списка.

4. @Zach amp; Nathan спасибо за участие в разделе комментариев, я действительно ценю вас, ребята, приветствия и счастливого кодирования 🙂

Ответ №2:

если я не ошибаюсь, вы можете сделать это :

 ng-repeat="user in users | .... | filter:conditionalSearch()"
  

а затем в вашем контроллере / ссылке добавьте это :

 $scope.conditionalSearch = function() {
    if ($scope.searchType == 'id') return { .. condition 1 .. }
    if ($scope.searchType == 'firstName') return { .. condition 2 .. }
}
  

Комментарии:

1. Закрыть! conditionalSearch функция — это функция, которая возвращает функцию с переданным текущим пользователем! $scope.conditionalSearch = function() { return function (currentUser) { return currentUser[$scope.SearchType] == $scope.criteria; } }; но убедитесь, что SearchType соответствует именам пользовательских свойств, включая регистр.

2. @Zach пожалуйста, не вносите радикальных изменений в код других ответов. Вместо этого опубликуйте свой собственный ответ, если считаете, что это может принести пользу другим и потоку в целом.

3. @EmileBergeron Прости меня. Я чувствовал, что его ответ был достаточно близок, чтобы оправдать изменения и похвалу, а не публиковать свои собственные.