Как заставить угловые пустые фильтры соответствовать неопределенным и нулевым значениям?

Я обнаружил проблему, когда вводил фильтр, а затем удалял его, коллекция продолжает фильтроваться и не отображает элементы с undefined или null значения в отфильтрованном термине.

Пример кода:

<div ng-app="App" ng-controller="AppController as app">
<p>
Filters
</p>
    Name: <input ng-model="listFilters.name" type="text"/>
    <br/>
    Short Description: <input ng-model="listFilters.shortDescription" type="text"/>

    <ul>
        <li ng-repeat="person in app.persons | filter:{name: listFilters.name, shortDescription: listFilters.shortDescription}">
            <p>{{person.name}}</p>
        </li>
    </ul>
</div>

Угловой код:

angular.module('App', []);
angular.module('App').controller('AppController', AppController);
function AppController() {
        var ctrl = this;

    ctrl.persons = [
        {
            name: 'Bill',
            shortDescription: null
        }, 
        {
            name: 'Sally',
            shortDescription: 'A girl'
        },
        {
            name: 'Jhon',
        },
    ];
}

Рабочая скрипка: https://jsfiddle.net/89pkcww2/

Шаги, чтобы увидеть проблему, о которой я говорю:

  1. Фильтр по имени, список фильтруется.
  2. Сотрите фильтр, посмотрите, как снова отображается список (Билл, Салли, Джон).
  3. Фильтр по описанию, список отфильтрован.
  4. Сотрите фильтр, отображается только второе значение коллекции (Салли), а значения с неопределенными или нулевыми значениями - нет. Это фильтрация по "пустой строке".

Я предполагаю, что это поведение по умолчанию в фильтрах Angular, но... есть ли способ его изменить? Должен ли я делать свой собственный фильтр?

Я хочу фильтровать по обоим свойствам отдельно, collection | filter: filter.var не служит для этой цели.

И это не то же самое, что фильтрация для отображения только ненулевых значений, это ближе к противоположному...


person Astaroth    schedule 21.03.2016    source источник
comment
stackoverflow.com/a/25177318/4759033   -  person Satej S    schedule 21.03.2016
comment
Я вообще не вижу дубликатов, это скорее противоположная функциональность, я не хочу фильтровать по !! или !null Я хочу фильтровать по значение, которое находится внутри ввода текста, и когда оно стирается, я хочу вообще не фильтровать. Поэтому мне нужно, чтобы фильтр одинаково оценивал 'undefined', null и '' (пустая строка).   -  person Astaroth    schedule 21.03.2016


Ответы (2)


  1. shortDescription: null , it doesnt mean '' , null != '' , so when you delete the text from the 'short description' it doesnt show 'Bill' item.
    1. on third item there is not shortDescription at all so the ng-model="listFilters.shortDescription" cant bind to the property.
    2. только элемент «Салли» работает нормально, потому что ng-модель может привязываться к свойству.
person Theo Itzaris    schedule 21.03.2016
comment
Да, я это знаю, я даже уточнил это в своем описании: Это фильтрация по пустой строке. Я хочу, чтобы (пустой) фильтр не выполнял никаких фильтров. Итак, я получаю элемент со значением 'undefined' shortDescription и null. - person Astaroth; 21.03.2016
comment
Итак, вы знаете, в чем проблема. Легче просто добавить свойство ко всем вашим элементам, чем создавать собственный фильтр, хотя вы можете создать собственный фильтр, это не имеет большого значения. Я мог бы создать пример. - person Theo Itzaris; 21.03.2016
comment
Я спросил, есть ли способ сделать это без написания фильтра или добавления полей в виде пустых строк, просто с угловым трюком или функциональностью, о которой я не знал, но я думаю, что есть ни один из них. - person Astaroth; 21.03.2016

Обновите свой li html примерно так:

<li ng-repeat="person in app.persons | filter:listFilters.name">

Вот обновленная скрипта: https://jsfiddle.net/89pkcww2/1/

person Suresh Kamrushi    schedule 21.03.2016
comment
Вау, это небольшая перестройка функциональности... Я фильтровал по элементам внутри элементов person и хочу сохранить эту функциональность, я не могу использовать общий collection | filter: some.filter - person Astaroth; 21.03.2016