Я использую компонент для отображения в нем изображения холста. Впервые работает нормально. После отображения я скрываю его, но после того, как снова отображаю компонент, он показывает мне предыдущее изображение, но я уже меняю источник изображения.
Итак, я хочу спросить, есть ли способ уничтожить этот экземпляр компонента, чтобы при его повторном рендеринге он все повторно инициализировал?
Я хочу повторно инициализировать его, потому что в компоненте есть много других переменных-членов, которые я тоже хочу повторно инициализировать.
Примечание: ngonchange уже пробовал
у меня есть кнопка закрытия, чтобы скрыть это. Но он просто скрывает, что он не восстанавливается при повторном отображении
Это сработало. Спасибо за помощь.





Это возможно, создав динамический компонент ...
Для этого вам необходимо выполнить следующие действия:
в родительском 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
Я не хочу его полностью разрушать. Мне нужен компонент, но я просто хочу повторно инициализировать все в этом компоненте, когда я снова его отображу.
Немного взломав шаблон *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 нет "чистого" способа сделать это, но вы избавили меня от написания тонны кода для обновления компонента, который не принимал наблюдаемое в качестве входных данных.
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 заставляет инициализировать компонент в следующем цикле.
если вы скрываете его с помощью * ngIf, если он должен регенерировать каждый раз, когда он отображается