когда вызывается цикл $ digest?

Я очень смущен, когда происходит цикл дайджеста, он называется периодически на основе таймера каждые 50 мс (как он здесь говорит и подразумевается здесь ), или он называется после каждого события, которое входит в угловой контекст (как здесь сказано здесь и здесь )?

Пример, когда это важно:

В моей модели у меня есть переменная с именем myVar со значением 3. В моем HTML у меня есть {{myvar}} . Событие, такое как нажатие кнопки, запускается и вызывает обработчик в controllerе, код внутри обработчика:

 $scope.myVar = 4; // some heavy actions takes place for 3 seconds... $scope.myVar = 5; 

Предполагая, что stream пользовательского интерфейса не заблокирован, что увидит пользователь после нажатия кнопки? он увидит только 5 или он увидит 4 и через 3 секунды 5?

    Я думаю, что описание цикла дайджеста в http://blog.bguiz.com/post/60397801810/digest-cycles-in-single-page-apps означает, что оно

    код, который работает с интервалом

    очень вводящим в заблуждение, и, если честно, когда я обращаюсь к Угловому, я бы даже сказал неправильно. По словам Павла Козловского, освоение разработки веб-приложений с помощью AngularJS

    AngularJS не использует какой-либо механизм опроса для периодической проверки изменений модели

    Чтобы доказать, что нет опроса, если у вас есть шаблон

     

    {{state}}

    и код controllerа

     $scope.state = 'Initial'; // Deliberately *not* using $timeout here $window.setTimeout(function() { $scope.state = 'Changed'; },1000); 

    как в этом plunker , строка, показанная пользователю, останется Initial и никогда не будет изменена на Changed .

    Если вам интересно, почему вы часто видите призывы к $apply , но не всегда, вероятно, потому, что различные директивы, которые поставляются с Angular, такие как ngClick или ngChange будут вызывать $apply , которые затем запускают цикл. Слушатели событий для родных событий JS напрямую не будут этого делать, поэтому им придется сознательно называть $apply чтобы любые изменения отражались в шаблонах.

    Процесс дайджестов запускается, когда любое из следующего происходит как часть углового контекста:

    • События DOM (например, ng-click и т. Д.)
    • Ajax с обратными вызовами ($ http и т. Д.)
    • Таймеры с обратными вызовами ($ timeout и т. Д.)
    • вызов $ apply, $ digest
    • и т.п.

    Важно отметить, что обычные события DOM, связанные с браузером (onclick и т. Д.) И setTimeout не будут вызывать процесс дайджеста, поскольку они работают из «Углового контекста».

    Я выучил вышеизложенное из следующего: Цикл дайджест Angularjs - TechCBT

    Вышесказанное представляет собой быстрый снимок из очень углубленного учебника, доступного здесь: https://www.youtube.com/watch?v=SYuc1oSjhgY

    Любая переменная области AngularJS при обработке извне (включая ajax) нуждается в $ apply ().

    setTimeout – это функция Javascript. Поэтому для обновления значений angularjs требуется $apply .

    $timeout – функция угловой функции, которая возвращает promise и заботится о текущей области действия и работает в том же цикле дайджеста.

    Поэтому не нужно использовать функцию $apply() для обновления значений.

    Давайте будем гением компьютера.