angular - Angular2将平面json加载为嵌套反应形式(结构不一样)
问题描述
我有一个返回(平面)json的服务,如下所示:
{
Name: "name",
email: "name@email.com",
address: "some address",
city: "some city"
}
我需要将该 json 加载到以下(嵌套)反应形式中:
this.resourceForm = this.formBuilder.group({
formArray: this.formBuilder.array([
this.formBuilder.group({
name: [null, Validators.required],
email: [null, Validators.required],
}),
this.formBuilder.group({
address: [null, Validators.required],
city: [null, Validators.required],
}),
])
});
我尝试使用以下代码,但它失败了,因为表单与 json 数据的结构不同:
protected loadResource() {
if (this.currentAction === 'edit') {
this.route.paramMap.pipe(
switchMap(params => this.resourceService.getById(+params.get('id')))
).subscribe(
(resource) => {
this.resource = resource;
this.resourceForm.patchValue(resource);
});
}
}
我如何(自动?)将这个平面 json 数据加载到嵌套的响应式表单中?有没有通用的方法来做到这一点?
解决方案
您的 formGroup 结构有些奇怪。我使用 FormArray 的方式总是作为相同类型的 FormGroups 的数组,我假设您有自己的理由这样做。您应该在表单中设置数据的方式如下:
....
).subscribe(
(resource) => {
const {Name, email, address, city} = resource;
const formArray = this.resourceForm.get('formArray');
formArray.at(0).setValue({name: Name, email});
formArray.at(1).setValue({address, city});
}
);
...
那应该可以解决您的示例。首先,我们将资源对象分解为不同的属性,然后将它们设置为表单(我不得不用 Name 来做这件事,因为一个以大写开头,另一个是小写)。
推荐阅读
- r - 如何更改 h2o 在 R 中创建和保存临时文件的方式?
- reactjs - ReactJs 映射 if/else
- css - 将 2d 图像转换为 3d 图像
- r - rvest 正确检查 html_text
- ios - 在 AlertController 中从 UIPickerView 填充文本字段时出现问题
- android - 关于Android Studio中Java中CheckBox的问题
- android - 从包中检索传递的参数时,为什么 Android Studio 会发出警告并建议使用 requireArguments() 而不是参数!!?
- jquery - 如何将格式更改为范围滑块的巴西标准
- powershell - 使用 Powershell 脚本将 .exe 从网络共享复制到远程计算机并安装 .exe 时出错
- scala - 如何将初始值从具有函数链接的过滤列表中传递给 foldLeft?