Подтвердить что ты не робот

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

Я предполагаю, что это сделано не так, но почему это выполняется так много раз?

4b9b3361

Ответ 1

Ваша функция запускается 10 раз. Почему 10? Почему не 100?

Ответ находится в документах:

Наблюдатель может изменить модель, которая может вызвать другие слушателей стрелять. Это достигается путем повторного наблюдения наблюдателей, пока нет изменения обнаружены. Лимит повторной итерации - 10, чтобы предотвратить бесконечный цикл тупика.

Когда вы это видите, это означает, что вы меняете модель таким образом, что Angular должен перезапустить дайджест и снова запустить часы. В вашем конкретном случае вы вызываете функцию, которая обновляет счетчик, который отображается на странице. Когда значение счетчика изменяется, он снова запускает дайджест, который вызывает функцию, которая обновляет счетчик и т.д. И т.д.

Angular ожидает, что вы (и действительно побуждаете вас) изменить модель и позволить виду реагировать на эти изменения, а не наоборот.

Ответ 2

Это ожидаемое поведение. Выражения Angular ({{expression}}) пересматриваются в каждом цикле $digest (иногда несколько раз за цикл). Это означает, что выражения должны оставаться светлыми в вычислительных терминах.

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

Ответ 3

AngularJs не предлагает вам изменять модель области при рендеринге. Если вы хотите изменить модель области действия, сделайте это в Контроллере или Директиве.

Думайте о представлении как месте для отображения данных (только значений области в этом случае), все изменения данных должны быть в контроллере или директиве.