2015-05-14 2 views
2

Все:Когда дайджест получить срабатывает в AngularJS

У меня вопрос о том, как angularjs данных переваривать мониторинг изменение данных области видимости, например:

<button ng-click="changename()">{{name}}</button> 

и функция изменения данных, как :

  $scope.name = "Change Name"; 
      $scope.changename = function(){ 
       $scope.name = "name1"; 
       $scope.name = "name2"; 
      } 

      $scope.$watch("name", function(newname, oldname){ 
       if(newname!=oldname){ 
        console.log("new: "+newname, "old: "+oldname); 
       } 
      }); 

Это changename изменение функции scope.name дважды подряд, но наблюдатель может только поймать переход от «изменить имя» до «имя2» (консоль печатает только «new: name2 old: Change Name»)

Может ли кто-нибудь подтвердить мое предположение, что цикл дайджеста начинается только после выполнения функционального блока?

Thanks

+0

Для будущих читателей вы также можете проверить ответы здесь: http://stackoverflow.com/questions/23460025/when-digest-cycle-is-called – user203687

ответ

2

Я хочу исправить ответ с rbaghbanli который вводит в заблуждение.

В самом деле, потому что JavaScript однопоточен, что случается, когда вы нажимаете на этой кнопки:

The variable `$scope.name` is set to "name1"; 
The variable `$scope.name` is set to "name2"; 
> end of execution stack 

Angular runs a $digest cycle 
The $watchers are executed 
since a watcher value has changed, angular runs another $digest cycle 
The $watchers are executed 
The watcher have the same value, end of $digest cycle 
> end of execution stack 

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

Причина Угловой запускает цикл дайджеста после вашего changename вызова, потому что она находится в пределах ng-click директивы, а также со всей угловой встроенной в директиве, код на самом деле завернут внутри $scope.$apply вызова. Вы можете прочитать ng-click как следующий код (даже если технически это не совсем так):

element.on('click', function() { 
    $scope.changename(); 
    $rootScope.$digest(); 
}); 

Примечание: Я хотел бы упростить общую идею, но быть технически верно, Угловое выполняет свои $ переваривать цикл сразу после вашего кода (как вы можете видеть в моем псевдо ng-click), в том же стеке выполнения. Это означает, что любой setTimeout или другой асинхронный вызов произойдет после цикла дайджеста и после того, как DOM был обновлен с последними изменениями, которые могут быть полезны иногда.

+0

Спасибо, так что вы подтверждаете мою догадку, не так ли? – Kuan

+0

Да, ваше предположение было правильным, и это не так специфично для AngularJS, но Javascript. Как правило, если вы хотите выполнить код * после * текущего «стека выполнения», мы используем 'setTimeout' – floribon

+0

Спасибо, не могли бы вы помочь с другим вопросом: http://stackoverflow.com/questions/30243804/why-ng- repeat-report-10-digest-iterations-достигло – Kuan

0

Да и нет. JavaScript выполняется в одном потоке, поэтому будет 2 вызова функции $ watch, но только после завершения $scope.changename(), поэтому 2-й вызов будет иметь newname == oldname == 'name2'.

+0

Спасибо, я испытаю это. – Kuan

0

В целом Угловые триггеры цикла дайджеста после некоторое событие произошло. В вашем случае директива ngClick запускает дайджест после выполнения предоставленного выражения. То же самое верно для ряда других событий, инициированных пользователем, например. mouseover, keydown, keypress.

Так что неважно, сколько раз вы меняете name внутри changename(); следующий цикл дайджеста будет «видеть» последнее назначенное значение.

+0

Спасибо, ключевой ответ, который я ищу, - это когда начинается дайджест, поэтому, согласно вашему, он начинается после завершения функции ng-click и в основном, вы подтверждаете мою догадки, правильно? – Kuan

+0

@Kuan В этом конкретном случае, да. Но вам не нужно догадываться об этом. В случае сомнений проверьте исходный код Углового. Я просто сделал это, чтобы ответить на ваш вопрос. :) –

+0

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

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