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
?
Ответы
Ответ 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();