2016-10-12 3 views
1

Скажите, что у меня есть выпадающий список, привязанный к свойству модели, которое будет проверено, чтобы определить модель, привязанную к моему текстовому полю.Условная привязка модели в 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, но я не могу заставить ее работать.

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

ответ

3

Вы можете указать 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 при изменении выпадающего значения. Так что поиск будет более точным.

Demo Plunkr

+2

Сделано plunker на этой основе хороший ответ для тестирования: https://embed.plnkr.co/MDlUpFFRKxQRg7rCO61v/ –

+1

О, ничего себе! Я не знал об этом! Он также выполняет частичное совпадение! – Zach

+0

@NathanBeck спасибо за plunkr, в моем коде была небольшая ошибка, когда вы меняли dropdown, объект 'search' сохранял значение свойства. Поэтому я проясняю, чем при смене. –

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 .. } 
} 
+0

Close! функция «conditionalSearch» - это функция, которая возвращает функцию с текущим пользователем, переданным в! '$ scope.conditionalSearch = function() {return function (currentUser) {return currentUser [$ scope.SearchType] == $ scope.criteria; }} ;, но убедитесь, что тип поиска соответствует именам свойств пользователя, включая случай. – Zach

+0

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

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^