【问题标题】:Programmatically set form's fields keeps the form invalid以编程方式设置表单的字段使表单无效
【发布时间】:2018-01-18 14:23:01
【问题描述】:

在 Ionic 3 / Angular 5 应用程序中,我有一个由 3 个字段组成的表单:

  • 名字(输入文本)
  • 生日(日期时间选择器)
  • 头像(单选按钮)

如果表单无效,提交按钮将被禁用: [disabled]="!addChildForm.valid"

在初始化时,我会检查用户是在创建一个新的孩子还是在编辑一个。我编辑,我以编程方式填充字段。 这工作正常,但提交按钮无效。虽然出生日期已经很好地填充了,但我必须单击它来打开(和关闭)选择器以启用提交按钮。

我的代码:

createForm(child?: Child): void {

      this.addChildForm = this.formBuilder.group({
        firstnameInput: ['', Validators.required],
        birthdateInput: ['', Validators.required],
        avatarInput: ['', Validators.required]
      });

      // If we are editing a child, populate the form
      if (child) {
        this.addChildForm.setValue({
          firstnameInput: child.firstname,
          birthdateInput: moment(child.birthdate).format(),
          avatarInput: child.avatar
        });
      }
    }

知道如何在填充表单后强制表单进行检查以启用提交按钮吗?

【问题讨论】:

    标签: angular ionic-framework angular-reactive-forms angular-forms


    【解决方案1】:

    不要构建表单并然后用数据填充它,而是在构建步骤中进行检查并一次性完成。像这样:

    createForm(child?: Child): void {
    
      this.addChildForm = this.formBuilder.group({
        firstnameInput: [child ? child.firstname : '', Validators.required],
        birthdateInput: [child ? moment(child.birthdate).format() : '', Validators.required],
        avatarInput: [child ? child.avatar : '', Validators.required]
      });
    }
    

    这是一个带有工作示例的链接:https://stackblitz.com/edit/angular-ygaoz7

    尝试将示例中this.child 的初始值更改为空字符串,您将看到表单更改并且提交按钮被禁用。当它们都有值时,按钮再次启用。

    【讨论】:

    • 那么这可能是您的数据有问题——属性firstnamebirthdateavatar 总是 已定义/在Child 上有值?
    • 是的,我看到他们正在填写表格。
    • 你能在 plunkr 或 stackblitz 中重现错误吗?
    • 我已经编辑了我的答案以包含一个带有工作示例的链接。
    • 我在formNamengModel 之间发生了冲突
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2018-07-08
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多