В 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

Другие вопросы по тегам