Я уже некоторое время использую AngularJS и обнаружил необходимость использовать $ timeout время от времени (похоже, для запуска плагина jQuery).
Недавно я попытался получить лучшее и более глубокое понимание цикла дайджеста, и я наткнулся на функцию $ evalAsync .
Кажется, что эта функция дает аналогичные результаты $timeout
, только вы не даете ей задержку. Каждый раз, когда я использовал $timeout
это, было с задержкой 0, так что теперь я задаюсь вопросом, должен ли я использовать $evalAsync
вместо этого.
Есть ли принципиальные различия между ними? Какие случаи вы бы использовали один над другим? Я хотел бы получить лучшее представление о том, когда использовать какой.
источник
Для тех, кто строит сложные приложения, учтите, что на ваш выбор влияет производительность. Кроме того, я хотел бы дополнить ответ Марка более техническими подробностями:
$ timeout (обратный вызов) будет ожидать выполнения текущего цикла дайджеста (то есть углового обновления всей модели и DOM), затем он выполнит свой обратный вызов - потенциально влияющий на угловую модель - затем запустит полное
$apply
в корневой области $ scope и произведет повторный анализ все.$ evalAsync (обратный вызов) , с другой стороны, добавит обратный вызов в текущий или следующий цикл дайджеста. Это означает, что если вы находитесь в цикле дайджеста (например, в функции, вызываемой из некоторой
ng-click
директивы), это ничего не будет ждать, код будет выполнен сразу же. Если вы находитесь в асинхронном вызове, например, asetTimeout
,$apply
будет запущен новый цикл дайджеста ( ).Таким образом, с точки зрения производительности всегда лучше вызывать
$evalAsync
, если только для вас не важно, чтобы представление обновлялось до выполнения вашего кода, например, если вам нужен доступ к некоторому атрибуту DOm, такому как ширина элементов и тому подобное.Если вы хотите получить более подробную информацию о различиях между $ timeout, $ evalAsync, $ digest, $ apply, я предлагаю вам прочитать мой ответ на этот другой вопрос: https://stackoverflow.com/a/23102223/1501926
Также обязательно прочитайте документацию :
источник
x
непосредственно из своей области, а не из DOM, чтобы вам не пришлось ничего ждать. Кроме того, вам лучше использоватьng-style
css, а не устаревшееwidth
свойство. Если вам нужна дополнительная помощь, пожалуйста, откройте новый вопрос на StackOverflow.