Angular如何将与FieldsToRender Id匹配的values数组对象传入子组件
解决方案
你可以根据你的使用场景选择以下两种实现方式:
场景1:每个渲染字段对应一个子组件
如果你需要遍历FieldsToRender数组,每个字段单独渲染一个子组件,直接在*ngFor循环中匹配对应值即可:
父组件模板写法:
<ng-container *ngFor="let field of FieldsToRender"> <app-childComponent [field]="field" [recordValue]="values.find(v => v.FieldId === field.Id)?.Value" ></app-childComponent> </ng-container>
说明:这里用find方法匹配FieldId和字段Id相同的值对象,?.可选链用来避免没有匹配值时抛出undefined错误。
场景2:单个子组件接收所有匹配值
如果你只需要渲染一个子组件,要把所有字段对应的匹配值统一传入,可以在父组件TS中提前计算好匹配结果,避免模板中频繁执行匹配逻辑影响性能:
父组件TS代码:
// 方法1:返回和FieldsToRender顺序一致的匹配值数组 get matchedRecordValues() { // 提前构建值映射表,提升匹配效率 const valueMap = new Map(this.values.map(v => [v.FieldId, v.Value])); return this.FieldsToRender.map(field => ({ field, value: valueMap.get(field.Id) ?? null })); } // 方法2:返回Id为键、值为内容的映射表,子组件可直接通过Id取值 get fieldValueMap() { return new Map(this.values.map(v => [v.FieldId, v.Value])); }
父组件模板写法:
<!-- 传匹配好的数组 --> <app-childComponent [FieldsToRender]="FieldsToRender" [recordValue]="matchedRecordValues"></app-childComponent> <!-- 或者传映射表 --> <app-childComponent [FieldsToRender]="FieldsToRender" [recordValue]="fieldValueMap"></app-childComponent>
注意事项
- 请确保
FieldsToRender中的Id字段唯一,否则find方法只会返回第一个匹配的结果 - 如果数组数据量较大,不要直接在模板中写
find逻辑,变更检测会频繁执行该方法导致性能下降,优先用提前计算映射表的方式实现
内容的提问来源于stack exchange,提问作者James.mikael
相关产品推荐
相关产品推荐

