Подтвердить что ты не робот

Angular 2 - Заменить для $scope. $apply?

$scope.$apply больше не будет частью Angular 2. Тогда как мы можем сообщить Angular для обновления DOM, если какой-либо из связанных свойств был изменен вне обычного контекста выполнения Angular?

Взято из сообщение в блоге Минько Гечева:

Больше $scope. $apply

Но как тогда AngularJS знает, что что-то вне его контекста исполнения заняло место? Давайте подумаем, где могут произойти изменения:

  • SetTimeout
  • setInterval
  • подскажите (да, есть люди, которые все еще используют его...)
  • XMLHttpRequest
  • WebSockets

  • ...

Для чего ответ:

enter image description here

Я понимаю, что исправление встроенных функций javascript в браузере для уведомления о любых изменениях в Angular - это то, что можно сделать относительно безопасным образом (без ввода тонких ошибок) и было бы очень удобно для разработчика. Но как насчет сторонних API (например, jQuery.fadeIn) или если браузер предоставляет новый асинхронный API, который не распространяется? Что заменит старый $scope.$apply?

4b9b3361

Ответ 1

Итак, библиотека, которая выполняет все эти исправления обезьян, zone.js.

jQuery.fadeIn вызывает setInterval, setInterval - пропатчен обезьяна, если вы назовёте jQuery.fadeIn внутри zone.run.

zone.fork и zone.run заменить $scope.$apply, но он отличается тем, что обнаруживает себя, когда асинхронные вещи завершены, тогда как вы должны называть $scope.$apply вручную, когда знаете, что все закончилось. См. Также этот вопрос + ответ: Использовать zone.js для определения текущего контекста выполнения из любого места?

если браузер предоставляет новый асинхронный API, который не распространяется?

Я думаю, они тоже исправят это.

Если все остальное не удается, вы все равно можете вызвать zone.afterTask() вручную.
Я предполагаю, что вы искали:)

Ответ 2

  • импортировать NgZone из ядра
  • private zone: NgZone в вашем конструкторе
  • this.zone.run(() => {});, где вы обычно scope.$apply

или

  • ChangeDetectorRef
  • private chRef: ChangeDetectorRef
  • chRef.detectChanges();