NGXS Forms - 如何处理嵌套的表单组件

NGXS Forms - How to handle nested form components

我有一个包含多个步骤的用户配置文件表单,即向导。在 Submit/Save,必须将整个用户个人资料表单提交给 API 我正在使用 NGXS 和 NGXS 表格。

目前我已经将 UI 实现为单个 Angular 反应形式和单个状态 属性 form,模型的类型为 API 预计。每个步骤都有一个组件,但它们都使用相同的form。 这种方法的一个大问题是我无法检测步骤上的字段是否有效,我只能检测整个表单是否有效。

要解决这个问题,我想我必须创建多个 Angular 表单。但是,我无法将它们全部绑定到相同的状态 属性 form,因为在每个步骤中我只有一部分属性。

所以,我现在的想法是在我的状态下为每个步骤创建一个表单 属性,每个步骤都有自己的接口来存储它的属性。然后,我可以创建一个选择器,它将 return 我可以提交给 API 的整个对象。

在代码中,当前:

form: {
  model: UserProfileDto,
  ....
}

提议:

personalDetailsForm: {
model: PersonalDetailsModel, 
},
workDetailsForm: {
model: WorkDetailsModel
}

@Selector(ProfileDetails)
profileDetails(state: ProfileState) {
  return {...state.workDetailsForm.model, ...state.personalDetailsForm.model}
}

这是要走的路还是有更简单的方法?

这是一个非常有意见的问题,但我可以分享我的想法。

在父组件中,我将为每个步骤创建单独的表单:

  • 它有助于为每个步骤编写验证规则;
  • 你可以检查一下,每一步都是valid/invalid表格
  • 以防万一,如果你把它存储在父组件中,你可以编写在步骤之间切换的逻辑(例如,如果当前步骤无效,则不允许转到另一个步骤)
export class Component {

  ngOnInit(): void {
    this.workDetailsForm = this.buildWorkForm();
    this.personalDetailsForm = this.buildPersonalForm();


    // and through merge + valueChanges you can get the last object at any time
    merge(
      this.workDetailsForm.valueChanges,
      this.personalDetailsForm.valuesChanges  
    )
    .subscribe(() => {
      this.profileDetails = {
        ...this.workDetailsForm.value, 
        ...this.personalDetailsForm.value
      };
    });

    // here you can check, that the whole form is valid
    merge(
      this.workDetailsForm.statusChanges,
      this.personalDetailsForm.statusChanges  
    )
    .subscribe(() => {
      this.isFormValid = this.workDetailsForm.valid && this.personalDetailsForm.valid;
    });
  }


}


<app-step-work-details
 [form]="workDetailsForm"> </app-step-work-details>

<app-step-personal-details
 [form]="personalDetailsForm"> </app-step-personal-details>