2013-12-11 2 views
1

Я пытаюсь понять фильтр «фильтр» в AngularJS. Понимая в документах, он также принимает второй параметр. Если он принят как «истинный», он выполняет строгое сравнение.Второй параметр фильтра не работает

HTML-

<fieldset> 
    <legend>Array of objects (Search all properties)</legend> 
    <input type="text" ng-model="searchObject" /> 
    <ul> 
     <li ng-repeat="value in arrOfObjects | filter: searchObject: true"> 
      <span>{{value.firstName}}</span> 
      <span> {{value.lastName}}</span>: 
      <span><strong>{{value.email}}</strong></span> 
     </li> 
    </ul> 
</fieldset> 

JS

$scope.arrOfObjects = [ 
    { 
     firstName: "Anup", 
     lastName: "Vasudeva", 
     email: "[email protected]" 
    }, 
    { 
     firstName: "Vijay", 
     lastName: "Kumar", 
     email: "[email protected]" 
    }, 
    { 
     firstName: "Virat", 
     lastName: "Kohli", 
     email: "[email protected]" 
    } 
]; 

То, что я ожидал, если я типа "Anup", он будет пытаться сделать точное соответствие со всеми свойствами и не сможет ничего вернуть. Поэтому я должен видеть пустой список.

Я что-то упустил.

+2

Он ничего для 'aNuP' не возвращаются: http://plnkr.co/edit/F2lbGkgADxV8tK8pZ0Rs?p=preview Что вы видите? Какую версию Angular вы используете? –

+2

Работает как ожидалось здесь: http://jsfiddle.net/C7vfp/ – KayakDave

+0

@KayakDave, спасибо большое. Можете ли вы сказать мне, что я сделал в своем коде? –

ответ

2

Это plunker, который показывает следующее объяснение: http://plnkr.co/edit/b1vuJV4RFNQSdpfaw0Pd?p=preview

Угловой фильтрация на объектах работает путем сравнения поля объекта, чтобы увидеть, если они содержат критерии фильтрации, игнорируя при этом случае. Это дает широкое использование, которое можно сузить, добавив второй логический параметр true, чтобы указать, что вы хотите отказаться от правила contains.

В вашем примере:

<fieldset> 
    <legend>Array of objects (Search all properties)</legend> 

    <input type="text" ng-model="searchObject" /> 

    <ul> 
     <li ng-repeat="value in arrOfObjects | filter: searchObject: true"> 
      <span>{{value.firstName}}</span><span> {{value.lastName}}</span>: <span><strong>{{value.email}}</strong></span> 
     </li> 
    </ul> 
</fieldset> 

Typing Vasudeva, Anup или [email protected] будет каждый отфильтровать все, кроме первой записи из-за точного совпадения на одном поле. Таким образом, точное совпадение на в любом поле приведет к отображению записи.

Удаление «истина»:

<li ng-repeat="value in arrOfObjects | filter: searchObject"> 

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

Для фильтрации на одном поле в объекте использовать этот формат:

<li ng-repeat="value in arrOfObjects | filter: {lastName :searchObject}"> 

и точно так же вы можете добавить второй булево значение, чтобы получить точное соответствие:

<li ng-repeat="value in arrOfObjects | filter: {lastName :searchObject}:true"> 

Наконец, вы можете создать настраиваемый фильтр, определяя функцию в вашем контроллере, которая возвращает true или false для данного совпадения.

<li ng-repeat="value in arrOfObjects | filter: myEmailFilter"> 

И в вашем контроллере напишите фактический фильтр.

$scope.myEmailFilter = function(value) { 
    console.log(value.email); 
    if(value.email.indexOf("email.com")>=0) { 
     console.log('true'); 
     return true; 
    } else { 
     console.log('false'); 
     return false; 
    } 
    }; 
+0

Большое спасибо за такое подробное объяснение. –

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