Для тех, кто строит сложные приложения, учтите, что на ваш выбор влияет производительность. Кроме того, я хотел бы дополнить ответ Марка более техническими подробностями:
$ timeout (обратный вызов) будет ожидать выполнения текущего цикла дайджеста (то есть углового обновления всей модели и DOM), затем он выполнит свой обратный вызов - потенциально влияющий на угловую модель - затем запустит полное $apply
в корневой области $ scope и произведет повторный анализ все.
$ evalAsync (обратный вызов) , с другой стороны, добавит обратный вызов в текущий или следующий цикл дайджеста. Это означает, что если вы находитесь в цикле дайджеста (например, в функции, вызываемой из некоторой ng-click
директивы), это ничего не будет ждать, код будет выполнен сразу же. Если вы находитесь в асинхронном вызове, например, a setTimeout
, $apply
будет запущен новый цикл дайджеста ( ).
Таким образом, с точки зрения производительности всегда лучше вызывать $evalAsync
, если только для вас не важно, чтобы представление обновлялось до выполнения вашего кода, например, если вам нужен доступ к некоторому атрибуту DOm, такому как ширина элементов и тому подобное.
Если вы хотите получить более подробную информацию о различиях между $ timeout, $ evalAsync, $ digest, $ apply, я предлагаю вам прочитать мой ответ на этот другой вопрос: https://stackoverflow.com/a/23102223/1501926
Также обязательно прочитайте документацию :
$ EvalAsync не дает никаких гарантий относительно того, когда выражение будет выполнено, только то, что:
- он будет выполняться после функции, которая запланировала оценку (предпочтительно до отображения DOM).
- после выполнения выражения будет выполнен как минимум один цикл $ digest.
Примечание: если эта функция вызывается вне цикла $ digest, будет запланирован новый цикл $ digest . Однако рекомендуется всегда вызывать код, который меняет модель, из вызова $ apply. Это включает в себя код, оцененный с помощью $ evalAsync.