Обнаружение угловых изменений для обновления только частичной страницы

Я работаю над угловым приложением 5.2. У меня есть 10 вкладок в моем базовом компоненте. и каждая вкладка имеет свой собственный компонент ( 4 компонента). Так что каждая моя вкладка имеет очень тяжелую обработку. Теперь мой вопрос: если я обновлю какой-либо дочерний компонент Tab, то angular запустит changeDetection на всех вкладках и их дочернем компоненте, что сделает мое приложение очень медленным.

Есть ли способ сообщить угловому запуску Change-Detection в определенной части страницы? Я знаю, это звучит немного странно, но мне нужно улучшить производительность приложения, и реальная проблема, я вижу, в том, что обнаружение изменений запускается для всей страницы ( 10 вкладок и каждая вкладка с 4 компонентами).

На данный момент я не публикую никакого кода, так как этот вопрос является общим, но если кто-то считает, что этот код будет полезным, я тоже могу это сделать.

2 ответа

Ты можешь использовать ChangeDetectionStrategy.OnPush

import {..., ChangeDetectionStrategy } from '@angular/core';

@Component({
  ...
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class CounterComponent {
  @Input() data;
}

Вручную пометить для обнаружения изменений.

import {..., ChangeDetectorRef } from '@angular/core';

export class CounterComponent {
    constructor(private cd: ChangeDetectorRef) {}
  ...
  ngOnInit() {
    this.data.subscribe((value) => {
      this._data = value;
      // tell CD to verify this subtree
      this.cd.markForCheck();
    });
  }
}

Обратитесь к документу для получения информации: https://angular.io/api/core/ChangeDetectorRef

Вы можете использовать ловушку жизненного цикла ngDoCheck, чтобы проверить мутацию объекта и уведомить Angular с помощью метода markForCheck.


export class AComponent {
  @Input() o;  constructor(private cd: ChangeDetectorRef) {}

  ngOnChanges() {
    // every time the object changes 
    // store the new `id`
    this.id = this.o.id;
  }

  ngDoCheck() {
    // check for object mutation
    if (this.id !== this.o.id) {
      this.cd.markForCheck();
    }
  }
}
Другие вопросы по тегам