Angular 使用FormBuilder提交空对象

Angular 使用FormBuilder提交空对象,angular,typescript,Angular,Typescript,如果用户从后端API服务获取对象,如: data:{firstName:'pepe',lastName:'test',address={street:'Cervantes',city:'villajoyoosa'}} 或数据:{firstName:'pepe',lastName:'test',address=null} 我想在formGroup中设置对象,但当address为null时出现问题,我想将address另存为null,而不是{street:'',city:'} form=this.f

如果用户从后端API服务获取对象,如:

data:{firstName:'pepe',lastName:'test',address={street:'Cervantes',city:'villajoyoosa'}}
或数据:{firstName:'pepe',lastName:'test',address=null}

我想在formGroup中设置对象,但当address为null时出现问题,我想将address另存为null,而不是{street:'',city:'}

form=this.fb.group({
名字:[''],
姓氏:[''],
地址:this.fb.group({
街道:[''],
城市:[''],
}),
});
//我设置了表格:
if(数据地址)
this.form.controls['address'].setValue(data.address)
保存(){
valueToSend=this.form.controls['address'].getValue()
}
//模板
拯救
地址
街道:
城市:

您必须使用已定义的表单结构,因此在提交表单时必须使用一些转换逻辑

例如:

const { firstName, lastName, address } = this.form;
const value = {
    firstName,
    lastName,
    address: address.street || address.city ? address : null
};
您还可以将此逻辑封装在实现
ControlValueAccessor
的组件中,如以下示例所示:

@Component({
  selector: "app-address",
  template: `
    <div [formGroup]="form">
      <input formControlName="street" />
      <input formControlName="city" />
    </div>
  `,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => AddressComponent),
      multi: true
    }
  ]
})
export class AddressComponent implements ControlValueAccessor, OnInit {
  form: FormGroup;

  constructor(private fb: FormBuilder) {}

  ngOnInit() {
    this.form = this.fb.group({
      street: [""],
      city: [""]
    });
  }

  writeValue(obj: any): void {
    this.form.setValue(obj);
  }

  registerOnChange(fn: any): void {
    this.form.valueChanges.pipe(map(x => x.city || x.street ? x : null)).subscribe(fn);
  }

  registerOnTouched(fn: any): void {
    //TODO
  }

  setDisabledState(isDisabled: boolean): void {
    //TODO
  }
}
@组件({
选择器:“应用程序地址”,
模板:`
`,
供应商:[
{
提供:NG_值访问器,
useExisting:forwardRef(()=>AddressComponent),
多:真的
}
]
})
导出类AddressComponent实现ControlValueAccessor,OnInit{
表格:表格组;
构造函数(私有fb:FormBuilder){}
恩戈尼尼特(){
this.form=this.fb.group({
街道:[“”],
城市:[“”]
});
}
writeValue(对象:任意):无效{
此.form.setValue(obj);
}
注册变更(fn:任何):无效{
this.form.valueChanges.pipe(map(x=>x.city | | x.street?x:null)).subscribe(fn);
}
注册人(fn:任何):无效{
//待办事项
}
setDisabledState(isDisabled:boolean):无效{
//待办事项
}
}

上进行演示时,您必须使用已定义的表单结构,因此在提交表单时,您必须使用一些转换逻辑

例如:

const { firstName, lastName, address } = this.form;
const value = {
    firstName,
    lastName,
    address: address.street || address.city ? address : null
};
您还可以将此逻辑封装在实现
ControlValueAccessor
的组件中,如以下示例所示:

@Component({
  selector: "app-address",
  template: `
    <div [formGroup]="form">
      <input formControlName="street" />
      <input formControlName="city" />
    </div>
  `,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => AddressComponent),
      multi: true
    }
  ]
})
export class AddressComponent implements ControlValueAccessor, OnInit {
  form: FormGroup;

  constructor(private fb: FormBuilder) {}

  ngOnInit() {
    this.form = this.fb.group({
      street: [""],
      city: [""]
    });
  }

  writeValue(obj: any): void {
    this.form.setValue(obj);
  }

  registerOnChange(fn: any): void {
    this.form.valueChanges.pipe(map(x => x.city || x.street ? x : null)).subscribe(fn);
  }

  registerOnTouched(fn: any): void {
    //TODO
  }

  setDisabledState(isDisabled: boolean): void {
    //TODO
  }
}
@组件({
选择器:“应用程序地址”,
模板:`
`,
供应商:[
{
提供:NG_值访问器,
useExisting:forwardRef(()=>AddressComponent),
多:真的
}
]
})
导出类AddressComponent实现ControlValueAccessor,OnInit{
表格:表格组;
构造函数(私有fb:FormBuilder){}
恩戈尼尼特(){
this.form=this.fb.group({
街道:[“”],
城市:[“”]
});
}
writeValue(对象:任意):无效{
此.form.setValue(obj);
}
注册变更(fn:任何):无效{
this.form.valueChanges.pipe(map(x=>x.city | | x.street?x:null)).subscribe(fn);
}
注册人(fn:任何):无效{
//待办事项
}
setDisabledState(isDisabled:boolean):无效{
//待办事项
}
}

在保存数据之前,不要担心表单。提交

save()
{
  const data={...this.form.value,address:...this.form.value.address} //<--create a copy
  if (!data.address.city && !data.address.street)
  {
       data.address=null;
  }
  ..make something with the data..
  myService.update(data)
}
save()
{

const data={…this.form.value,address:…this.form.value.address}/在保存数据之前,不要担心表单

save()
{
  const data={...this.form.value,address:...this.form.value.address} //<--create a copy
  if (!data.address.city && !data.address.street)
  {
       data.address=null;
  }
  ..make something with the data..
  myService.update(data)
}
save()
{

常量数据={…this.form.value,地址:…this.form.value.address}//您需要与数据共享设置表单中值的代码您可以使用
*ngIf
,示例:
您需要与数据共享设置表单中值的代码您可以使用
*ngIf
,示例:
,您将如何实现表单结构以避免这种逻辑?Regard我已经提供了我为您的问题提供了一个更清晰的解决方案,您将如何实现表单结构以避免这种逻辑?我为您的问题提供了一个更清晰的解决方案