Почему angularjs дважды вызывает функцию `name ()`?

Код прост:

    AngularJS Plunker document.write("");     Hello {{name()}}!    var app = angular.module('plunker', []); app.controller('MainCtrl', function($scope) { $scope.name= function() { console.log("---name---:" + new Date()); return "Freewind"; }; });  

Вы можете видеть, что есть функция name и мы вызываем ее в теле только один раз. Но в консоли он дважды печатает ---name---: ::

 ---name---:Wed Feb 20 2013 14:38:12 GMT+0800 (中国标准时间) ---name---:Wed Feb 20 2013 14:38:12 GMT+0800 (中国标准时间) 

Вы можете увидеть демо-версию здесь: http://plnkr.co/edit/tb8RpnBJZaJ73V73QISC?p=preview

Почему функция name() была вызвана два раза?

В AngularJS все, что завернуто в двойные фигурные скобки, является выражением, которое оценивается по крайней мере один раз во время цикла дайджеста.

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

Как правило, это хорошая идея, чтобы вызывать только идемпотентные методы (например, name ) из шаблона именно по этой причине.

  • Реализация загрузчика с использованием httpInterceptor и AngularJS 1.1.5
  • Нет заголовка «Access-Control-Allow-Origin» присутствует в запрошенном ресурсе - AngularJS
  • Получение MathJax для обновления после изменений в модели AngularJS
  • Перезагрузка страницы дает неправильный запрос GET с режимом AngularJS HTML5
  • Как перебирать элементы, возвращаемые функцией с помощью ng-repeat?
  • AngularJS: Ошибка при сбое: Не удалось создать экземпляр модуля?
  • Пользовательская форма проверки валидации для сравнения двух полей
  • AngularJS: Сервис против поставщика и завода
  • Как вы используете $ sce.trustAsHtml (string) для репликации ng-bind-html-unsafe в Angular 1.2+
  • вызов метода родительского controllerа из директивы в AngularJS
  • Одностраничное приложение - загрузка js-файла динамически на основе частичного представления
  • Давайте будем гением компьютера.