我对ngrx
有点陌生,但遇到了这个小问题,但尚未弄清楚如何解决。
基本上,我有一个ListComponent
,它呈现了ListItemComponent
存储中的ngrx
数组。
@Component({
...
template: `
<list-item *ngFor="let item of item$ | async" [data]="item">
</list-item>
`
})
export class ListComponent implements OnInit {
item$: Observable<ListItem>;
constructor(private store: Store<ListState>) {}
ngOnInit() {
this.item$ = this.store.select(selectListItems);
}
}
现在,在
ListItemComponent
内部,在某些特定情况下,我想呈现另一个ListComponent
,可以在其中添加项目,但是由于出现Maximum call stack size exceeded
错误,因此此方法不起作用。我的猜测是,如果我错了,请纠正我,因为嵌套的
ListComponent
正在访问与根ListComponent
相同的状态片,它只是试图将相同的列表一遍又一遍地嵌套并呈现为无穷大。所以这是问题,我应该如何构成我的选择器,以便在状态树中为每个嵌套的
ListComponent
提供正确的入口点?编辑
这是一个working stackblitz project,现在我的应用程序中在
List
中呈现ListItem
的逻辑是不同的,但问题是相同的。 最佳答案
我觉得你是对的:
尝试更新ListComponent
以接受ListItemComponent
的组件输入变量。参见工作示例https://stackblitz.com/edit/angular-ngrx-recursive-components-7mzncj
在该示例中,第5个ListItemComponent
也呈现了ListComponent
。但是,单击第5个ListItemComponent上的“将元素添加到列表”按钮时,代码仍会将新元素添加到父列表中。我猜您将要更新其处理方式的逻辑。不知道您要完成什么。
核心问题是列表正在生成自身。因此,如果一个列表生成另一个列表,则会遇到递归问题。通过使用组件输入变量,可以停止列表自身的生成并消除递归问题。
更新:
我自己一个人来回答这个问题,但是我只是注意到@FanCheung在评论中以前提出了基本上是什么解决方案。