2016-06-05 2 views
3

Мне интересно, что это преимущество или недостаток использования одного над другим:В 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(...) вне зоны углов, тогда трудно узнать, будет ли this.ref.markForCheck() охватывать все элементы, которые могут изменить их состояние в результате этой довольно сложной операции.

Также, если this.router.navigateXxx(...) вызывает некоторые асинхронные вызовы, ваш markForCheck будет запущен до того, как эти асинхронные вызовы будут завершены и не вызовет обнаружение изменений в конце, поскольку это, вероятно, необходимо.

С

this.zone.run(() => this.router.navigateXxx(...)) 

это не имеет значения, потому что this.router.navigateXxx() и весь код, который вызывается этим вызовом (синхронной и асинхронной) будет работать внутри зоны и углам главного использовать его исправленную API.

Я не знаю, о точном различии между app.tick и markForCheck но app.tick также действительно есть недостаток пояснено выше для markForCheck

+1

получил его ... это имеет смысл, this.zone.run является более мощным, как вы иметь будущие операции в пределах зоны, которая будет также обнаружена ... получилось, tx, как всегда! - born2net 20 минут назад – born2net

Смежные вопросы