Angular функция области действия, выполняемая несколько раз
Я определил функцию в области. И когда я вызываю это из представления внутри {{}}, он выполняет X раз.
контроллер
function testCtrl($scope) {
$scope.myFunc = function(name) {
return "Hello " + name;
}
}
HTML
<div>{{myFunc('Joe')}}</div>
Вы можете увидеть это в этом примере: http://jsfiddle.net/rbRvD/2/
Или с помощью Plunker: http://plnkr.co/edit/LLQ7cKs2fEoBwv0C5XPE
Я предполагаю, что это сделано не так, но почему это выполняется так много раз?
Ответы
Ответ 1
Ваша функция запускается 10 раз. Почему 10? Почему не 100?
Ответ находится в документах:
Наблюдатель может изменить модель, которая может вызвать другие слушателей стрелять. Это достигается путем повторного наблюдения наблюдателей, пока нет изменения обнаружены. Лимит повторной итерации - 10, чтобы предотвратить бесконечный цикл тупика.
Когда вы это видите, это означает, что вы меняете модель таким образом, что Angular должен перезапустить дайджест и снова запустить часы. В вашем конкретном случае вы вызываете функцию, которая обновляет счетчик, который отображается на странице. Когда значение счетчика изменяется, он снова запускает дайджест, который вызывает функцию, которая обновляет счетчик и т.д. И т.д.
Angular ожидает, что вы (и действительно побуждаете вас) изменить модель и позволить виду реагировать на эти изменения, а не наоборот.
Ответ 2
Это ожидаемое поведение. Выражения Angular ({{expression}}
) пересматриваются в каждом цикле $digest (иногда несколько раз за цикл). Это означает, что выражения должны оставаться светлыми в вычислительных терминах.
В этом случае оценка выражения не должна приводить к вызову AJAX или какой-либо другой интенсивной или асинхронной операции, или если это необходимо, чем вы должны кэшировать результаты.
Ответ 3
AngularJs не предлагает вам изменять модель области при рендеринге. Если вы хотите изменить модель области действия, сделайте это в Контроллере или Директиве.
Думайте о представлении как месте для отображения данных (только значений области в этом случае), все изменения данных должны быть в контроллере или директиве.