Почему ViewContainerRef не заполняется несколькими экземплярами компонентов?

#angular

#angular

Вопрос:

Я просматриваю документацию в Angular Fundamentals, пытаясь понять, как FactoryComponentResolvers и ViewContainerRefs это работает . , , Приведенный ниже фрагмент кода взят из документации Angular. https://angular.io/guide/dynamic-component-loader.

Код циклически перебирает ads массив и постоянно загружает новый adItems в дочерний шаблон.

Мой вопрос в том, почему этот процесс не приводит к многократному (в конечном итоге неуправляемому) количеству загружаемых экземпляров одного и того же компонента? Наряду с loadComponent() методом, не должен ли быть какой-то unloading или destroying процесс, предотвращающий накопление слишком большого количества экземпляров? Или destroying это каким-то образом происходит за кулисами? Или viewContainerRef.createComponent(componentFactory) достаточно умен, чтобы знать, что если он уже создал компонент, он просто вернет ссылку на этот существующий компонент, а не создаст новый? Заранее большое спасибо, если кто-нибудь может, пожалуйста, уточнить!

 export class AdBannerComponent implements OnInit, OnDestroy {
  @Input() ads: AdItem[];
  currentAdIndex = -1;
  @ViewChild(AdDirective) adHost: AdDirective;
  interval: any;

  constructor(private componentFactoryResolver: ComponentFactoryResolver) { }

  ngOnInit() {
    this.loadComponent();
    this.getAds();
  }

  ngOnDestroy() {
    clearInterval(this.interval);
  }

  loadComponent() {
    this.currentAdIndex = (this.currentAdIndex   1) % this.ads.length;
    let adItem = this.ads[this.currentAdIndex];

    let componentFactory = this.componentFactoryResolver.resolveComponentFactory(adItem.component);

    let viewContainerRef = this.adHost.viewContainerRef;
    viewContainerRef.clear();

    let componentRef = viewContainerRef.createComponent(componentFactory);
    (<AdComponent>componentRef.instance).data = adItem.data;
  }

  getAds() {
    this.interval = setInterval(() => {
      this.loadComponent();
    }, 3000);
  }
}

  

Ответ №1:

пусть ViewContainerRef = this .adHost.ViewContainerRef; ViewContainerRef.clear()

В этой части кода loadComponent функция извлекает ссылку на объект adHost ViewContainerRef и избавляется от существующего содержимого. Итак, отвечаю на ваш вопрос о том, почему viewContainerRef.createComponent страница не заполняется объектами компонентов, потому что clear функция сначала удаляет существующий компонент, прежде чем создавать что-либо новое.