使用动态组件容器时如何停止重复初始化
how to stop repeat initialisation when using dynamicComponentContainer
我有一个循环遍历组件列表并从列表中加载组件的布局。
为了实现这一点,我使用了 dynamic-component,因为我需要一种动态的方式来注入从 object.
定义的组件
如果我单击动态加载的组件,它会运行动态组件 2、3、4 次。我不明白为什么在 child 组件中的偶数之后我得到了我的组件 re-intialised。有没有办法阻止这个或者应该如何动态注入组件。
这是我发现动态注入组件并能够将数据传递给 child 的唯一方法,因为 ngComponentOutlet 当前位于 angular ] 4 不允许您从创建和注入的 child 组件传递和检索数据。
笨蛋:http://plnkr.co/edit/vslspJ?p=preview
@Component({
selector: 'my-app',
template: `
<div>
<buttons (passdata)="getthis($event)" ></buttons>
<button (click)="loadDogs()">Load Dogs</button>
<hr />
<div *ngFor="let comp of componentlist">
<dynamic-component [componentData]="configureWidget(comp)"></dynamic-component>
</div>
<hr />
</div>
`,
})
export class AppComponent {
componentlist:any = [
{ name: 'dogs', component: dogsComponent, inputName: 'colordata', inputvalue: 'zzz' },
{ name: 'cats', component: catsComponent, inputName: 'showNum', inputvalue: 'zzz' }
]
configureWidget(widget){
console.log(widget)
if(widget.name == 'dogs'){
return this.componentData = {
component: widget.component,
inputs: {
showNum : 'ddddd',
}
};
}
if(widget.name == 'cats'){
return this.componentData = {
component: widget.component,
inputs: {
colordata : 'ddddd',
}
};
}
}
问题出在 AppComponent
以及您如何将 componentData
传递给动态组件。 Angular 的变化检测知道 variable
它们是否发生了变化,但如果您在模板中使用了函数,它就无法判断。
所以不要使用函数传递处理后的数据,否则changeDetection会调用函数,再次处理数据并传递,这将调用dynamic-component
中的setter
函数并初始化再次.
代码:
configuredWidgets = {};
constructor(){
this.componentlist.forEach(comp => {
console.log(comp)
if(comp.name == 'dogs'){
this.configuredWidgets['dogs'] = {
component: comp.component,
inputs: {
showNum : 'ddddd',
}
};
}
if(comp.name == 'cats'){
this.configuredWidgets['cats'] = {
component: comp.component,
inputs: {
colordata : 'ddddd',
}
};
}
})
}
我有一个循环遍历组件列表并从列表中加载组件的布局。 为了实现这一点,我使用了 dynamic-component,因为我需要一种动态的方式来注入从 object.
定义的组件如果我单击动态加载的组件,它会运行动态组件 2、3、4 次。我不明白为什么在 child 组件中的偶数之后我得到了我的组件 re-intialised。有没有办法阻止这个或者应该如何动态注入组件。
这是我发现动态注入组件并能够将数据传递给 child 的唯一方法,因为 ngComponentOutlet 当前位于 angular ] 4 不允许您从创建和注入的 child 组件传递和检索数据。
笨蛋:http://plnkr.co/edit/vslspJ?p=preview
@Component({
selector: 'my-app',
template: `
<div>
<buttons (passdata)="getthis($event)" ></buttons>
<button (click)="loadDogs()">Load Dogs</button>
<hr />
<div *ngFor="let comp of componentlist">
<dynamic-component [componentData]="configureWidget(comp)"></dynamic-component>
</div>
<hr />
</div>
`,
})
export class AppComponent {
componentlist:any = [
{ name: 'dogs', component: dogsComponent, inputName: 'colordata', inputvalue: 'zzz' },
{ name: 'cats', component: catsComponent, inputName: 'showNum', inputvalue: 'zzz' }
]
configureWidget(widget){
console.log(widget)
if(widget.name == 'dogs'){
return this.componentData = {
component: widget.component,
inputs: {
showNum : 'ddddd',
}
};
}
if(widget.name == 'cats'){
return this.componentData = {
component: widget.component,
inputs: {
colordata : 'ddddd',
}
};
}
}
问题出在 AppComponent
以及您如何将 componentData
传递给动态组件。 Angular 的变化检测知道 variable
它们是否发生了变化,但如果您在模板中使用了函数,它就无法判断。
所以不要使用函数传递处理后的数据,否则changeDetection会调用函数,再次处理数据并传递,这将调用dynamic-component
中的setter
函数并初始化再次.
代码:
configuredWidgets = {};
constructor(){
this.componentlist.forEach(comp => {
console.log(comp)
if(comp.name == 'dogs'){
this.configuredWidgets['dogs'] = {
component: comp.component,
inputs: {
showNum : 'ddddd',
}
};
}
if(comp.name == 'cats'){
this.configuredWidgets['cats'] = {
component: comp.component,
inputs: {
colordata : 'ddddd',
}
};
}
})
}