В angular2 преимущество использования zone.run по сравнению с changeDetecotor.markForCheck()
Мне интересно, в чем преимущество или недостаток использования одного над другим:
constructor(private app:ApplicationRef, private ref:ChangeDetectorRef) {
this.ref.markForCheck();
// OR
this.ref.detectChanges()
// will do same thing?
...
против
zone.run
(() => doSomething())
...
против
app.tick();
все они по существу будут отмечать компонент для проверки и обновления / перерисовки пользовательского интерфейса.
я знаю app.tick()
будет делать это для всего приложения, но в моих тестах это фактически не заставляло пользовательский интерфейс обновляться.
zone.run
а также markforCheck
оба вынуждают пользовательский интерфейс обновляться при следующей проверке цикла зоны, так зачем использовать один поверх другого?
1 ответ
Если вы запускаете код, который влияет только на текущий компонент, как
someServiceThatRunsOutsideZone.getData()
.subscribe(data => {
this.data = data;
this.ref.markForCheck();
});
this.ref.markForCheck()
просто отлично.
Если вы делаете, например, this.router.navigateXxx(...)
за пределами зоны Angulars, то трудно понять, если this.ref.markForCheck()
охватит все элементы, которые могут изменить свое состояние с помощью этой довольно сложной операции.
Также если this.router.navigateXxx(...)
вызывает несколько асинхронных вызовов, ваш markForCheck
будет выполняться до завершения этих асинхронных вызовов и не будет вызывать обнаружение изменений в конце, так как это, вероятно, необходимо.
С
this.zone.run(() => this.router.navigateXxx(...))
это не важно, потому что this.router.navigateXxx()
и весь код, который вызывается этим вызовом (синхронизация и асинхронность), будет выполняться в зоне Angulars и использовать его исправленный API.
Я не знаю о точной разнице между app.tick
а также markForCheck
но app.tick
также имеет недостаток, объясненный выше для markForCheck