2014-01-13 1 views
2

Попытка использовать фильтр по директиве с изолята сферы:

<div tags="p.tags | refTags"></div> 

вызывает бесконечный цикл в $ переваривать цикл:

Эта ошибка возникает, когда модель приложения становится нестабильной, и каждый цикл $ digest запускает изменение состояния и последующий цикл $ digest. Угловая обнаруживает эту ситуацию и предотвращает бесконечный цикл, чтобы браузер не реагировал.

.directive 'tags', -> 
    restrict: 'A' 
    scope: 
     tags: '=' 
    templateUrl: 'partials/tags.html' 


.filter 'refTags', -> 
    (tags) -> 
     ['a filtered', 'array of values'] 

обертоны/tags.html

<ul> 
    <li ng-repeat="tag in tags">{{tag.tag}}</li> 
</ul> 

p.tags в контроллере

p.tags = ['HTML5', 'CSS', 'JavaScript', 'Angular JS', 'Backbone JS', 'Node JS', 'SASS + Compass', 'Oragami', 'Running', 'Cat Food', '#catfood'] 

Является ли такое поведение нормально?

  1. Может ли фильтр не использоваться для значения, передаваемого в область выделения директивы?
  2. Есть ли обходной путь для этого? Мне нужно отфильтровать значения массивов
  3. Есть ли другое решение с другим дизайном?
+0

Это не полный фильтр refTags? Можете ли вы поделиться этим кодом? –

+0

Да, это все, что есть. Это coffeescript, если это вызывает какую-либо путаницу. – TaylorMac

+0

Итак, ваш фильтр фактически возвращает массив с двумя элементами «отфильтрованный» и «массив значений» ... как он фактически фильтрует эти значения? –

ответ

5

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

Причина, из-за которой возникает бесконечный цикл цикла $ digest, заключается в том, что в фильтре каждый цикл цикла дайджеста возвращает другой объект, который вызывает дополнительный цикл.

Предлагаю вам начать с возвращения того же массива, то есть input = output. Убедитесь, что все работает так, как ожидалось. После этого добавьте соответствующее условие.

+0

Согласен, если вы просто возвращаете произвольный массив в фильтре, Angular не распознает модель, возвращаемую вашим фильтром, и переваривание продолжается. –

+0

Спасибо, Максим и Джонатан. Это проясняет ситуацию. Отлично – TaylorMac

+0

@TaylorMac, если вы когда-нибудь делаете 'console.log()' на модели, вы увидите, что Angular назначает кучу вещей, чтобы отслеживать это.Это еще одна причина, по которой примитивы сложны для Углового, потому что он не может присвоить свои метаданные строке. –

1

This question provides an actual workaround.

Короче говоря, передайте фильтр, который вы хотите использовать в своей директиве, а затем используйте его там.

+0

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

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