【问题标题】:Angular2 Reactive forms, FormControl default value in pristine statusAngular2反应形式,FormControl默认值处于原始状态
【发布时间】:2018-02-06 13:23:16
【问题描述】:

我创建了一个表单,允许用户通过单击按钮添加其他文本输入。这些输入后面的FormControls 存储在FormArray 内部的FormGroup 中。

我想为这些输入提供一个默认值,如果它们是原始的,则将被提交。如果用户更改输入的值,将其更改为脏,我不希望提交或显示默认值。

我目前正在显示这样的输入,因为占位符属性完全符合我的要求,仅在输入未更改时才显示默认名称。

<div
    formArrayName="names" 
    *ngFor="let server of names.controls; let i = index; trackBy:trackByFn">
        <span>{{ i + 1 }}</span>
        <input 
        type="text" 
        formControlName="{{i}}"
        placeholder="{{defaultName}}">

</div>

为了验证名称,我创建了以下验证函数:

export function validateServerName(form: FormGroup): ValidationErrors | null {
    const names: string[] = form.value[CREATE_FORM_KEY_NAMES];

    for (const name of names) {
        if (name.trim() === '') {
            return {
                invalidName: true
            };
        }
    }

    return null;
}

在这里我无法确定元素是脏的还是原始的,因为form.value[key] 只返回一个字符串数组,而不是 FormControls 的数组。

我正在寻找一种更简单的方法来完成我想要实现的目标,或者寻找一种正确验证表单的方法。

【问题讨论】:

  • 你可以使用form.get('controlname')
  • 你用过formBuilder吗?
  • 没有@RIYAJKHAN,建立在表单构建器尚不存在时创建的旧代码

标签: html angular typescript angular-reactive-forms


【解决方案1】:

您可以使用检查控制状态

如果触摸是真的,那么它是脏的

this.form.get('controlname').touched 

对于原始的,您可以像这样检查

this.form.get('controlname').pristine

更新

对于表单数组,它将类似于

  let val = this.user.get('<FormArray>') as FormArray;
  console.log(val.at(index));

您现在可以在此变量上使用 pristinetouched

【讨论】:

  • 我需要访问 FormArray 中的控件,您的回答帮助我找到了解决方案,但您可能需要更新它,以便在我接受您的回答时上下文是正确的。
猜你喜欢
  • 2017-02-11
  • 2017-01-31
  • 2017-04-29
  • 1970-01-01
  • 2018-05-21
  • 2018-08-05
  • 2020-05-13
  • 2015-11-03
  • 1970-01-01
相关资源
最近更新 更多