【问题标题】:Angular2 patchValue JSON data to formArrayAngular2 patchValue JSON数据到formArray
【发布时间】:2019-06-22 21:43:33
【问题描述】:

我有一个这样的 Json 数据:

assets/details.json

{
    "name" : "john",
    "age"  : 20,
    "address" : [{
        "main": "address1",
        "sub": "address2"
    },
    {
        "main": "add1",
        "sub": "add2"
    }]
}

我想用 patchValue 以 Angular 形式显示所有 JSON 数据。

我试过了。

app.component.ts

export class AppComponent {
  data: FormGroup

  constructor(private FB: FormBuilder, private service: DataService) { }

  ngOnInit() {
    this.data = this.FB.group({
      name: [''],
      age: [''],
      address: this.FB.array([
        this.addAddress()
      ])
    })

    this.getData()

  }

  addAddress(): FormGroup {
    return this.FB.group({
      main: [''],
      sub: [''],
    })
  }

  getData() {
    this.service.getData('../assets/details.json').subscribe((data) => {
      this.data.patchValue({ data })
    }
}

我的 HTML 页面是这样设计的: app.component.html

<form [formGroup]="data" (ngSubmit)="onSubmit()">
  <input formControlName="name" type="text" class="form-control col-sm-8">
  <input formControlName="age" type="number" class="form-control col-sm-8">

  <div formArrayName="address" *ngFor="let d of data.get('address').controls; let i = index;">
    <div [formGroupName]="i">
      <input formControlName="main" type="text" class="form-control">
      <input formControlName="sub" type="text" class="form-control" />
    </div>
  </div>
</form>

但没有什么能像我预期的那样工作。没有什么可以填写表格。我不知道该怎么做。

如何在表单字段中获取所有这些 JSON 数据?

【问题讨论】:

  • 您需要在 formControl 而不是 formGroup 上调用 patchValue() 方法
  • 我听不懂。你能解释更多吗?
  • 如果不是,那么如何在 formGroup 中做到这一点?我是 Angular 新手。
  • 它是否适用于 this.data.patchValue(data) 而不是 this.data.patchValue({data})
  • 尝试修补控件,例如this.data.controls.name.patchValue(data.name); 然后其余部分相同

标签: angular formarray


【解决方案1】:

patchValue 只更新现有的FormArray,不会修改你的FormArray 的结构。打补丁前要确保你的FormArray大小合适,也可以完全重新创建,如下图:

this.data.patchValue({ name: data.name, age: data.age });

this.data.controls['address'] = this.FB.array(data.map(address => {
    const group = this.addAddress();
    group.patchValue(address);
    return group ;
}));

看到这个post for more details

【讨论】:

    【解决方案2】:

    如果您的表单中没有FormArray,您可以只使用this.data.patchValue(data)(或setValue,如果所有属性都匹配),但由于您有一个表单数组,您需要迭代您的address对象中的数组并将表单组推送到您的表单数组。另外我认为在构建表单时不需要最初创建一个空的表单组,所以我把它省略了:

    ngOnInit() {
      this.data = this.FB.group({
        name: [''],
        age: [''],
        address: this.FB.array([])
      })
    }
    
    get formArr() {
      return this.data.get('address') as FormArray;
    }
    
    // ....
    this.data.patchValue({name: data.name, age: data.age});
    data.address.forEach((x) => {
      this.formArr.push(this.FB.group(x))
    });
    

    【讨论】:

    • 好的,我试试看。
    • 有一个 getter,我们从这里返回地址 FormArray。我喜欢缩短它,所以例如在模板中不需要使用let x of data.get('address).controls,你可以使用formArr.controls,ts 文件也是如此,但如果你不想要一个 getter 则不需要 :)
    • 它工作正常。谢谢你。但我有一个简单的问题,它显示了这样的错误。你能帮我解决这个问题,如何解决?图片链接:imgur.com/a/wPQj2Ij
    • 请务必先清除您的 FormArray,因为您只是在打补丁时推送新项目
    • HttpClient 解析您对一个对象的响应,但不知道该对象包含什么。我在这里假设您没有在您的服务中输入您的响应,这会导致问题。无论如何,httpclient 文档中有一个部分。简而言之,要么使用括号表示法,要么做一个接口(接口是我的建议):angular.io/guide/http#type-checking-the-response
    【解决方案3】:
      this.formCustomer.patchValue({ ...response.data })
       response.data.contactos.forEach(c => {
         this.contactos.push(this.Contact(c))
        });
          
    get contactos(): FormArray {
      return <FormArray>this.formCustomer.get("contactos")
          }
    
    Contact(item?:any): FormGroup {
            return this.fb.group({
              tipo: [item?item.tipo:'', [Validators.required]],
              nombre: [item?item.nombre:'', [Validators.required]],
              tel: [item?item.tel:'', [Validators.required]],
              tel_2: [item?item.tel_2:''],
            })
          }
    this.formCustomer = this.fb.group({
        contactos: this.fb.array([this.Contact()]),
        })
    

    【讨论】:

      【解决方案4】:

      getData() 方法的工作原理如下:

      getData() {
          this.service.getData('../assets/details.json').subscribe((_data) => {
            this.data.patchValue(data)
            (this.data as FormGroup).setControl('address', this.fb.array(this.data.address || []);
          }
      }
      

      【讨论】:

      • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit your answer 添加解释并说明适用的限制和假设。
      猜你喜欢
      • 2017-05-18
      • 2018-12-20
      • 2020-04-26
      • 2020-04-20
      • 2019-12-19
      • 2017-04-16
      • 1970-01-01
      • 2021-04-26
      • 2020-01-23
      相关资源
      最近更新 更多