почему вызывается ngDoCheck (), когда я вызвал detach () из ChangeDetectorRef?

Я просматривал несколько статей об обнаружении изменений и пытался включить или отключить обнаружение изменений с помощью changeDetectorRef.detach() и changeDetectorRef.reattach().

Я также подключил компонент к ngDoCheck(), но обнаружил, что ngDoCheck() вызывается даже после detach(). Что я делаю неправильно ? Может кто-нибудь объяснить, почему называется ngDocheck()? У меня даже ChangeDetectionStartegy установлен на OnPush. Это статья, которую я читал, чтобы понять обнаружение изменений

Я также создал для этого пример: https://stackblitz.com/edit/angular-4ytdbs


person CruelEngine    schedule 13.11.2018    source источник
comment
Ответ: blog.angularindepth.com/   -  person SeleM    schedule 13.11.2018
comment
@selemmn в статье ничего не упоминается о changeDetectorRef.detach() и о том, как ведет себя ngDoCheck(), или обнаружение изменений из-за этого :(   -  person CruelEngine    schedule 13.11.2018


Ответы (1)


Это потому, что detach() отделяет компонент от его собственного ChangeDetector, не позволяя проверять привязки шаблона / ввода / хоста. Это другое дело, чем делает ngDoCheck. Это используется для реализации своего рода настраиваемого обнаружения изменений для изменений, которые, как вы знаете, произойдут, но angular не может их предвидеть. Он вызывается для любого цикла в любом месте приложения.

Я полагаю, единственный способ не запускать ваш код внутри вашего ngDoCheck - это установить флаг при отсоединении:

ngDoCheck(): void {
  if (attached) {
    // ...
  }
}

Но я уверен, что вы тоже догадались :)

ссылка, предоставленная @selemmn, действительно дает хорошее представление

person Poul Kruijt    schedule 13.11.2018
comment
в официальных документах говорится, что ngDoCheck () вызывается после каждого цикла обнаружения изменений. Но здесь я отсоединил changeDetector, поэтому обнаружение изменений не должно вызываться, пока оно не будет повторно подключено, поэтому ngDoCheck() не следует вызывать, верно? или мне что-то здесь не хватает? - person CruelEngine; 13.11.2018
comment
@CruelEngine, твоя интерпретация неверна. Цикл обнаружения изменений - это tick() от ApplicationRef. Он вызывается всегда, независимо от настроек детектора изменения ваших компонентов. NgDoCheck не является частью компонента changeDetector, а представляет собой настраиваемую реализацию обнаружения изменений. Это всегда будет называться - person Poul Kruijt; 13.11.2018
comment
Я создал другой пример, чтобы понять, как работает ngDoCheck() аналогичным образом. ngDoCheck() вызывается только через 5 секунд, когда вызывается ref.reattach(). Ссылка на Stackblitz: stackblitz.com/edit/angular-r2zlev - person CruelEngine; 13.11.2018
comment
в вашем примере он вызывается одновременно. Не из-за повторного подключения, а из-за срабатывания setInterval. Это вызовет tick во всем приложении - person Poul Kruijt; 13.11.2018