2015-07-08 3 views
2

ФИЛЬТР в шаблонезапутаться, когда фильтр оценки В angularJS

Использование фильтра в шаблоне вида будет пересчитывать фильтр на каждом переваривать От углового документа.

Даже если значение выражения не меняется, оно переоценивается (или говорят, что вход для фильтра не изменяется). То, что я знаю для каждого выражения, будет установлен. Во время цикла дайджеста он проверяет любое изменение значения выражения, если да, чем будет срабатывать наблюдатель. И выражение будет переоцениваться. Но почему фильтр пересматривается на каждом дайджесте, даже когда ввод не меняется.

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

Раньше он говорил, что будет переоценивать каждый дайджест во втором жирном тексте, который они говорят всякий раз, когда вводится изменение. Какая разница между двумя. https://docs.angularjs.org/guide/filter

Update

Я сделал reveraFilter

app.js Файл

angular.module('todoApp') 
    .filter('reversa', function() { 
     return function(input, condition) { 
      input = input || ''; 
      var out = ''; 
      for (var i = 0; i < input.length; i++) { 
       out = input.charAt(i) + out; 
      } 
      return out; 
     }; 
    }) 
    .controller('MainCtrl', function($scope, reversaFilter) { 


     $scope.todo = ''; 
     $scope.text = 'shriyansh'; 
     // $scope.text = reversaFilter($scope.text); 


    }); 

Частичный HTML

<div class="container"> 
    <h2>My todos</h2> 
    <input type="text" ng-model="todo"> 
    <div>{{text|reversa}}</div> 
</div> 

я поставил точку останова внутри Ретур n функционал фильтра. Когда я изменяю значение переменной todo, это также код фильтра выполнения. Но я помещал фильтр в текст, чтобы не делать это.

ответ

1

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

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

Если изменение одной переменной вызывает другую переменную, чтобы изменить (например: {{a + b = c}} бы вызвать c изменить, если a или b были изменены), переход на второй переменной запускает новый $digest произойти, чтобы оценить, если эти изменения повлияют на любые другие переменные и т. д. Цикл $digest является только «стабильным», если нет никаких изменений в наблюдаемых переменных.

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

Здесь важно, чтобы функции фильтра были idempotent. Если фильтр имеет побочные эффекты, эти побочные эффекты могут поместить $digest в бесконечный цикл. Цикл $digest можно было поймать в положении, когда каждое изменение вызывает другое изменение, которое вызывает другое изменение, постоянно.

Петля $digest имеет прорывную точку и произведет ошибку 10 iterations reached и перестанет обрабатываться, если встретится с этим потенциальным бесконечным контуром. Кроме того, в попытке сохранить это не является проблемой, фильтр сам по себе выполнен только в том случае, если входы меняются. Таким образом, хотя фильтр оценил, он не является выполненным каждый цикл, если это необходимо.

+0

Квалифицированные средства пересматривают средства для проверки того, какое выражение изменилось или нет. –

+0

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

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