【问题标题】:Angular8 - FormGroup setValue only if string is not emptyAngular8 - 仅当字符串不为空时才设置 FormGroup
【发布时间】:2020-06-11 09:11:07
【问题描述】:

在我的项目中,我有几个FormControls

app.component.ts

  readonly titleCtrl = new FormControl()
  readonly descriptionCtrl = new FormControl()
  readonly ageCtrl = new FormControl(null)

我已添加到 FormGroup:

  readonly formGroup = new FormGroup({
    title: this.titleCtrl,
    description: this.descriptionCtrl,
    age: this.ageCtrl,
  })

然后存储在我的 Mongo DB 中:

private fillForm(item: Item): void {
  this.formGroup.setValue(
    {
      title: item.title.overrideValue,
      description: item.description.overrideValue,
      age: item.age.overrideValue,
    },
    { emitEvent: false },
  )
}

所以一切正常,并将我的值存储在数据库中。但它也在数据库中存储空值。我该怎么办,这是不可能的?

如果用户编辑例如title 这个函数将它作为title.overrideValue 存储在数据库中,这没关系。但是如果用户再次编辑标题并删除了值(所以title是一个空字符串),它应该取title.sourceValue

提前致谢。

【问题讨论】:

    标签: angular angular8 form-control formgroups


    【解决方案1】:

    为您的 formGroup 使用验证器:

    readonly formGroup = new FormGroup({
        title: new FormControl(this.titleCtrl, Validators.required),
        description: this.descriptionCtrl,
        age: this.ageCtrl,
      });
    

    然后,您可以为每个表单字段使用自定义 getter 并自定义验证消息:

      get titleFormControl() { return this.formGroup.get('titleFormControl'); }
      get titleFormControlErrorMessage() {
        if (this.titleFormControl.hasError('required')) {
          return 'Title is required';
        }
    
        return '';
      }
    

    在你的模板中:

    <span *ngIf="titleFormControl.invalid">{{titleFormControlErrorMessage}}</span>
    

    无论如何,任何客户端验证(角度)都必须在您的服务器 api 中重复。很快,在您的服务器中,再次检查该字段是否为空,如果是则抛出异常。

    【讨论】:

      【解决方案2】:
      private fillForm(item: Item): void {
        this.formGroup.setValue(
          {
            title: item.title.overrideValue ?  item.title.overrideValue :  item.title.sourceValue,
            description: item.description.overrideValue,
            age: item.age.overrideValue,
          },
          { emitEvent: false },
        )
      }
      

      item.title.overrideValue ? item.title.overrideValue : item.title.sourceValue 中的? 称为ternary operator,基本上是单行 if 语句。 如果item.title.overrideValue 等于""undefined,它将使用sourceValue,否则使用overrideValue

      您可以尝试的其他事情是防止空输入(通过验证器)。 Angular 文档为此提供了example

      【讨论】:

      • 谢谢。该解决方案并非 100% 有效。如果 overrideValue 现在是空的,它显示的 sourceValue 是好的。但是如果我删除表单中的值,我可以保存它并且它仍然在数据库中存储一个空字符串
      • 您需要在发送之前验证表格。在您发送它的方法中,只需检查所有字段并在必要时替换,如果您也可以发布发送方法,我可以进一步帮助您。
      • 这个setValue 是我发送它的地方。所以通常overrideValue 是空的,sourceValue 永远不会是空的。所以只有当这个输入字段中确实有一个值时才应该使用它。否则它可能是空的
      • 目前,当overrideValuenull 时,它也采用sourceValue,但如果用户编辑标题并删除该值,则它不是null 它的“”。跨度>
      • 所以你的意思是当item.title.overrideValue 等于"" 它仍然被使用?因为在 javascript/typescript 中,"" 应该默认为 false,因此应该使用三元的右侧。
      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 2016-08-29
      • 1970-01-01
      • 2016-02-29
      • 2018-01-15
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      相关资源
      最近更新 更多