Почему 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() был вызван два раза?

 Eugene22 июн. 2014 г., 17:55
иногда очень трудно добраться доточный вопрос, который вы ищете. Спасибо за это!
 saurabh09 сент. 2016 г., 11:45
Хотя вы можете ограничить его вызов только один раз, используя переменную init ref:plnkr.co/edit/l57V2rzX51JumtAtWXBN?p=preview надеюсь это поможет.

Ответы на вопрос(1)

Решение Вопроса

выражение что оцениваетсяХотя бы один раз во время цикла дайджеста.

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

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

 saurabh09 сент. 2016 г., 11:37
Безусловно, вы можете избавиться от двойного выполнения таких функций, добавив переменную init для переноса ее значения. ссылка:stackoverflow.com/a/39408368/1666582
 minchiya30 янв. 2015 г., 17:59
Я новый пользователь AngularJS. Я нахожу это странным. Итак, все методы контроллера должны быть идемпотентными? Пожалуйста, поделитесь документацией, если у вас есть? - Спасибо
 Josh David Miller20 февр. 2013 г., 18:48
Правильно!только вещь гарантирована, что он будет работатьпо крайней мере один раз.
 minchiya31 янв. 2015 г., 06:36
Спасибо. Что касается документации, я начал использовать angularJs. Но мне нужно лучше понять, что происходит за кулисами, например, цикл дайджеста ... Если вы знаете хороший учебник, я был бы признателен
 desbo14 июл. 2014 г., 15:11
@JoshDavidMiller спасибо за это. Есть ли способ привязать результат некоторых вычислений к представлению без использования вызова метода в скобках? Например:plnkr.co/edit/cFHa6uhYbZc6QwNoLw10?p=preview
 Josh David Miller14 июл. 2014 г., 16:52
@desbo Вы можете вручную поддерживать переменную области видимости, которая обычно является предпочтительным подходом, если метод выполняет какие-либо вычисления; Затем контроллер при необходимости изменяет переменную области видимости (вручную или через часы). Но причина, по которой твой Плункер нет работа в том чтоcount являетсяназначенный, не упоминается. Демо обоих:plnkr.co/edit/miXH6b6HsRWwDNKVgiPP?p=preview
 Josh David Miller31 янв. 2015 г., 04:00
@minchiya - Все методы контроллера, являющиеся идемпотентными, не будут хорошим эмпирическим правилом, но нужно обязательно помнить о производительности, выбирая методы, которые оцениваются во время дайджеста. Не все методы контроллера являются; во время дайджеста будут оцениваться только те, которые связаны как выражения. Какую документацию вы ищете?
 desbo14 июл. 2014 г., 19:19
Ах, спасибо. Итак, вы бы посоветовали не выставлять сервисы непосредственно в контроллерах, как я, и вместо этого создавать обертки для методов сервисов в контроллере?
 Josh David Miller14 июл. 2014 г., 22:38
Это может зависеть от деталей.В общемЯ размещаю сервисы на области, которые представляютвещи, но я не помещаю какие-либо услуги в область, которая представляетдействия, ЭтоuserService не пошел бы на прицел, ноcurrentUser было бы. Это компромисс для разделения интересов. Я отмечу, однако, что здесь есть некоторые разногласия относительно наилучшей практики.
 Liviu T.20 февр. 2013 г., 09:48
+1, также чтобы прояснить: angularjs может вызывать любую функцию, связанную в представлении влюбой указать во время фазы дайджеста имножественный фазы дайджеста могут быть выполнены. Это делаетбез гарантии о количестве звонков.
 Josh David Miller31 янв. 2015 г., 07:00
руководство имеет коллекцию довольно хороших учебных пособий (включая официальный). Также посмотрите отличные видео наэрудит, Но если ты'действительно хотите узнать овнутренности, путеводитель на страницахсамонастройки икомпилятор обязательно читать.
 Josh David Miller09 сент. 2016 г., 19:24
@Saurabh: Я согласен с использованием переменных вместо функций для всех, кроме тривиальных вещей. Тем не менее, это делаетне предотвратить выражение более чем один раз. Все, что находится в фигурных скобках, будет оценено дважды. Если оно'Если это функция, она будет вызвана дважды, но еслиs переменная, ее значение все еще будет извлеченодважды - потому что что-то еще в цикле могло изменить это.

Ваш ответ на вопрос