2013-08-18 2 views
1

Во-первых, моя причина для создания пользовательского компаратора в первую очередь заключается в том, что атрибут выражения, являющегося массивом - например, «теги», - требовал выражения имеют значения в определенном порядке и не соответствуют друг другу. (Таким образом, выражение с тегами ['a', 'b'] будет соответствовать ['x', 'a', 'b', 'y'], но не ['x', 'b', 'a', ' y '].)

Мне удалось обойти это, потому что в службе фильтрации Angular $ filter вы можете предоставить пользовательский компаратор. Тем не менее, я могу фильтровать только по типу атрибутов, а не по значению ключа.

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

Здесь не приводится пример моего пользовательского компаратора: (найденный в http://plnkr.co/edit/eFeinQhHTIZrzXBm4srq)

$scope.inclusiveFilter = function(expected, actual){ 
    if(expected && actual){ 
     console.log(expected, actual); 
     if(angular.isArray(expected) && angular.isArray(actual)){ 
      for(var t in actual){ 
       if(expected.indexOf(actual[t]) == -1){ 
        return false; 
       } 
      } 
     } 

     return true; 
    } 
    } 

В моем примере фильтр на тегах работает просто отлично, но он больше не работает на $, чтобы соответствовать любой собственности, я Я могу сравнивать атрибуты только по типу, а не по имени. Поэтому такое выражение никогда не могло бы работать:

{ 
    includeThese: ['a', 'b'], 
    excludeThese: ['x', 'y'] 
} 
+0

Я не знаю, если это поможет вам, но вы можете использовать ключевое значение пары с нг-повтора (ключ, значение) в выражении - где ключ и значение могут быть любые пользовательские идентификаторы, и выражение - это выражение области действия, которое позволяет подсчету коллекции. Например: (имя, возраст) в {'adam': 10, 'amalie': 12}. – Brett

ответ

4

Я не совсем уверен, что понимаю, о чем вы просите. Я сделал plunkr для вас с двумя настраиваемыми функциями фильтра, которые ищут «a» и «b» в порядке в элементе списка, а тот, который ищет «a» и «b», просто находится в тегах для этого пункт. Надеюсь, вы можете принять это и изменить его, чтобы делать то, что вы хотите. Я думаю, что для ваших целей пользовательская функция фильтра будет легче иметь дело с обычным компаратором.

http://plnkr.co/edit/fJ9iPQYyhGxAt00xi0OY

+0

Компаратор 'inclusiveComparator' в этом примере определен, но не используется. Есть ли какой-нибудь пример использования компаратора? Док так запутан. –