2016-12-01 9 views
0

Объект:

Object 
    $$hashKey: "object:25" 
    id: 1 
    category: "Fruit" 
    name: "Apple" 
    color: "red" 
    __proto__: Object 

Javascript (coffescript):

$scope.fruits = [ 
     {id: 1, category: "Fruit", name: "Apple", color: "red"} 
    ] 

Html:

<input type="search" ng-model="fruitSearch"/> 


    <div ng-repeat="i in filtro = (fruits | scFilter:fruitSearch)"> 
     <div>{{i.id}}</div> 
     <div>{{i.category}}</div> 
     <div>{{i.name}}</div> 
     <div>{{i.color}}</div> 
    </div> 

код фильтра (JS/кофе)

.filter "scFilter",() -> 
     (collection, search) -> 
      if search 
       regexp = createAccentRegexp(search) 
       doesMatch = (txt) -> 
        (''+txt).match(regexp) 
       collection.filter (el) -> 
        if typeof el == 'object' 
         return true for att, value of el when (typeof value == 'string') && doesMatch(value) 
        doesMatch(el) 
        false 
       else 
        collection 

Так что я хочу здесь фильтровать только отображаемые элементы (id, category, name и color), но по какой-то причине, когда я набираю 25 на входе, объект все еще появляется из-за его $$ haskKey.

+0

Пожалуйста, включите ваш код фильтра или описание/ссылку/документацию, если вы используете ранее существовавший из библиотеки. –

+1

Добавлен код фильтра. – Reeenatu

ответ

1

Благодарим за добавление кода фильтра. Решение должно быть простым, как явно игнорируя $$hashKey при поиске совпадений:

.filter "scFilter",() -> 
    (collection, search) -> 
    return collection unless search 
    regexp = createAccentRegexp(search) 
    doesMatch = (txt) -> (''+txt).match(regexp) 
    collection.filter (el) -> 
     if typeof el == 'object' 
     return true for att, value of el when typeof(value) is 'string' and doesMatch(value) and att isnt '$$hashKey' 
     else 
     doesMatch(el) 

Я добавил некоторые небольшие refactors:

  • Я изменил верхний уровень, если заявление к пункту охраны, который уменьшает уровень отступа кода
  • изменил короткую doesMatch функции на один лайнер
  • использования and, is и isnt в своем условном операторе

Основное изменение было пропустить какой-либо атрибут с key равным $$hashkey

Это проверялось, так что я надеюсь, что это работает для вас.

+0

Спасибо большое! Теперь он не фильтрует hashKey, если бы я мог только попросить немного больше, он будет фильтровать числовое значение, а, например, объект «Apple» имеет вес 15, поэтому, если я напечатаю 15, он принесет мне этот объект (при условии, что вес отображается в html) '$ scope.fruits = [ {id: 1, категория:" Фрукты ", название:" Apple ", цвет:" красный ", вес: 15 } ] ' – Reeenatu

+0

Я играл в arround с этой строкой« typeof (value) является «string», и мне удается делать то, что я хочу, заменяя «string» на «number», но как я могу добавить плюс, так что я мог бы фильтровать оба, например (typeof (value) является «string» и/или «number») – Reeenatu

+0

Nevermind, мне удалось найти решение хе-хе, просто продублировав строку: (** return true для att, значение el, когда typeof (value) - это «string» и doesM atch (value) и att isnt '$$ hashKey' и att isnt 'id' **) и помещает 'number' вместо 'string' – Reeenatu