当我使用ViewContainerRef
创建组件并将实例分配给负责子组件创建的父组件的属性时,我是否需要在调用{{null
后将此属性设置为ViewContainerRef.clear()
1}}如果我想释放内存?
答案 0 :(得分:7)
不,如果您将父组件属性指定给componentRef
angular,则不会从内存中删除组件。
Angular仅销毁组件并删除其对此组件的引用。但是对componentRef的引用仍然存在于组件属性中。所以我会为其分配null
。这样垃圾收集就能清除内存
Plunker Example (add => clear => check)
@Component({
selector: 'my-app',
template: `
<div>
<button (click)="addComponent()">Add component</button>
<div #container></div>
<button (click)="clear()">Clear</button>
<button (click)="check()">check</button>
</div>
`,
})
export class App {
comp: ComponentRef<DynamicComponent>;
constructor(
private vcRef: ViewContainerRef,
private resolver: ComponentFactoryResolver) {}
addComponent() {
let factory = this.resolver.resolveComponentFactory(DynamicComponent);
this.comp = this.vcRef.createComponent(factory);
}
clear() {
this.vcRef.clear();
}
check() {
alert(this.comp);
}
}
另见
答案 1 :(得分:0)
我不是百分百肯定,但Angular会在路由器删除其父组件时调用动态创建的组件的ngOnDestroy()方法。
这是一个吸虫:https://plnkr.co/edit/rAX6745xZi6EvP8N78IL?p=preview
import {Component, NgModule,Injector, ComponentFactoryResolver,
TemplateRef, ViewChild, ViewContainerRef} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import {Routes, RouterModule, Route} from '@angular/router';
@Component({
selector: 'my-other',
template: `<div>other</div>`
})
export class Other {}
@Component({
selector: 'my-cmp',
template: `<div>
my cmp
<ng-content></ng-content>
</div>
`
})
export class MyComp {
ngOnDestroy() {
console.log('dynamic component ngOnDestroy is called');
}
}
@Component({
selector: 'my-app',
template: `
<a routerLink="/viewchild">go viewchild</a>
<a routerLink="/other">go other</a>
<div>
<router-outlet></router-outlet>
</div>
`
})
export class App {}
@Component({
selector: 'my-prt',
template: `
<div>
<button (click)="create()">Create</button>
<div #vc>
<my-cmp>static one</my-cmp>
</div>
</div>
`,
})
export class Parent {
@ViewChild('vc', {read: ViewContainerRef}) vc: ViewContainerRef;
cmpRef = [];
constructor(private injector: Injector, private componentFactoryResolver: ComponentFactoryResolver) {
}
create() {
const projectableNodes = [[document.createTextNode('a'), document.createTextNode('b')]];
const factory = this.componentFactoryResolver.resolveComponentFactory(MyComp);
this.cmpRef.push(this.vc.createComponent(factory, this.injector, undefined, projectableNodes);
}
ngOnDestroy() {
//this.cmpRef.forEach(ref=>ref=null);
}
}
let routes = [
{path:'viewchild', component: Parent},
{path:'other', component: Other}
];
@NgModule({
imports: [ BrowserModule, RouterModule.forRoot(routes ],
declarations: [ App, MyComp, Parent, Other ],
entryComponents: [MyComp],
bootstrap: [ App ]
})
export class AppModule {}