Повторно создать компонент в angular 4

Я использую компонент для отображения в нем изображения холста. Впервые работает нормально. После отображения я скрываю его, но после того, как снова отображаю компонент, он показывает мне предыдущее изображение, но я уже меняю источник изображения.

Итак, я хочу спросить, есть ли способ уничтожить этот экземпляр компонента, чтобы при его повторном рендеринге он все повторно инициализировал?

Я хочу повторно инициализировать его, потому что в компоненте есть много других переменных-членов, которые я тоже хочу повторно инициализировать.

Примечание: ngonchange уже пробовал

если вы скрываете его с помощью * ngIf, если он должен регенерировать каждый раз, когда он отображается

happyZZR1400 14.03.2018 12:58

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

Rohit 14.03.2018 13:45

Это сработало. Спасибо за помощь.

Rohit 14.03.2018 14:12
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
3
1 219
3

Ответы 3

Это возможно, создав динамический компонент ...

Для этого вам необходимо выполнить следующие действия:

в родительском html:

<ng-template #dynamic></ng-template>

в вашем родительском файле component.ts:

@ViewChild("dynamic", {read: ViewContainerRef}) container;
componentRef: ComponentRef<any>;

constructor(...
              private resolver: ComponentFactoryResolver
...) 

    createComponent() {
      if (this.componentRef) this.componentRef.destroy();
      this.container.clear();
      const factoryGleam: ComponentFactory<YourComponent> = this.resolver.resolveComponentFactory(YourComponent);
      this.componentRef = this.container.createComponent(factoryGleam);
}

ngOnDestroy() {
if (this.componentRef) this.componentRef.destroy();
}

Используйте свой метод createComponent (), если вы хотите снова создать компонент ...

И в вашем родительском модуле:

  ...
  providers: ...,
  entryComponents: [YourComponent]

Или вы можете прочитать эту статью: https://medium.com/front-end-hacking/dynamically-add-components-to-the-dom-with-angular-71b0cb535286

Я не хочу его полностью разрушать. Мне нужен компонент, но я просто хочу повторно инициализировать все в этом компоненте, когда я снова его отображу.

Rohit 14.03.2018 13:49

Немного взломав шаблон *ngFor, вы можете создать новый экземпляр при изменении:

Шаблон :

<ng-template #MyTemplate let-name = "name">
  <hello name = "{{ name }}"></hello>
</ng-template>

<ng-container *ngFor = "let value of values">
  <ng-container *ngTemplateOutlet = "MyTemplate;context:{name: value}">
  </ng-container>
</ng-container>

<input type = "text" [(ngModel)] = "name" (ngModelChange) = "change($event)">

Составная часть :

  values = ['Template'];


  change(event) {
    this.values.pop();
    this.values.push(event);
  }

Здесь вы можете найти работающий пример. Счетчик отображает количество экземпляров.

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

John Evans 28.01.2020 21:48

So I want to ask is there any way I can destroy this instance of component so that when it is again rendered it re-initializes everything?

Пример кода

В шаблоне родительского компонента:

  <child-comp *ngIf = "isShown">
  </child-comp>
   <button (click) = "toggleChild()">Toggle</button>
   <button (click) = "reInit()">ReInitialize</button>

Родительский компонент класса:

class ParentComponent{

    isShown = false;

    toggleChild(){       
       this.isShown = !this.isShown;
    }


    reInit() {
       this.isShown = false;
        setTimeout(() =>{
           this.isShown = true;
        });
    }
}

setTimeout необходим, если мы хотим немедленно повторно инициализировать компонент. Без него компонент не будет повторно инициализирован за один цикл дайджеста. В первом цикле компонент уничтожается, setTimeout заставляет инициализировать компонент в следующем цикле.

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