【问题标题】:How to add custom validation to template-driven form without creating new directive (max-characters)如何在不创建新指令(最大字符)的情况下向模板驱动的表单添加自定义验证
【发布时间】:2019-07-15 10:10:51
【问题描述】:

我有一个模板驱动的表单。我需要添加自定义验证器,它将检测输入中的最大字符并显示错误消息,如果我们收到错误消息,则必须禁用按钮“确定”。我有 5-7 个输入,在代码示例中,我只提供 2 个来显示语法。

我尝试了 max-characters = 10,但该属性不允许输入超过 10 个字符。在我的情况下,用户可以输入任何他想要的字符(超过 10 个),但在他输入第 10 个字符后,它应该是错误消息并且按钮必须是已禁用。

不幸的是,我是模板驱动表单的新手,我的任务是只在模板表单中执行此操作。伙计们,有人可以向我解释使用输入和自定义验证器制作表单的最佳方法吗?任何帮助都会有所帮助。

<form
    class="my_ex_form"
    #myExForm="ngForm"
    novalidate>
    <div class="input">
      <label class="required">One</label>
      <input
        ngxTrim='keyup'
        required
        #one="ngModel"
        name="one"
        maxlength="64"
        [(ngModel)]="ex.name"
        placeholder="Enter...">
      <span *ngIf="one.value?.length >= 10" class="error-text">Max length 10 characters.</span>
    </div>
   <div class="input">
      <label class="required">Two</label>
      <input
        ngxTrim='keyup'
        required
        #two="ngModel"
        name="two"
        maxlength="10"
        [(ngModel)]="ex.nameTest"
        placeholder="Enter...">
      <span *ngIf="two.value?.length >= 10" class="error-text">Max length 10 characters.</span>
    </div>
    <div>
     <button
        type="submit"
        [disabled]="someOtherInputsValue || someOtherCheckboxesValue"
        class="btn btn-short"
        (click)="validate(myExForm)">
        ok
      </button>
    </div>
</form>

【问题讨论】:

    标签: angular forms validation


    【解决方案1】:

    您可以使用引用变量并手动使用 setError,请参阅示例中,我的引用变量是“input1”,并且我等于“ngModel”,这允许我们使用 input1.invalid 或 input1.control .setErrors() 有点像

    <input #input1="ngModel" [(ngModel)]="value" 
       (input)="input1.control.setErrors(input1.value.length>10?'max length':null)">
    {{input1.invalid}}
    

    如果我们愿意,我们可以制作一个函数

    checkControl(control:NgModel)
      {
        if (control.control.value && control.control.value.length>10)
          control.control.setErrors({error:"Max length exceded"})
        else
        control.control.setErrors(null)
      }
    

    我们的形式是这样的

    <form #myform="ngForm">
    <input #input1="ngModel" name="input1" [(ngModel)]="value1" 
       (input)="checkControl(input1)">
    {{input1.invalid}}
    <input #input2="ngModel" name="input2" [(ngModel)]="value2" 
       (input)="checkControl(input2)">
    {{input2.invalid}}
    </form>
    {{myform.invalid}}
    

    stackblitz

    【讨论】:

    • 感谢您的回答,我尝试了这样的解决方案,但收到错误Argument type "max length" is not assignable to parameter type ValidationErrors | null
    • 我更新了我的答案,创建了一个函数和一个 stackblitz。在 Angular 8 中,我没有错误分配文字,而不是对象
    【解决方案2】:

    如果控件的值之间没有依赖关系,则不需要自定义指令。我尝试运行您的代码,除了OK 按钮外,它按预期工作。

    您可以使用myExForm.invalid 设置/取消设置按钮元素中的disabled 属性。

    【讨论】:

    • 我需要知道输入了多少个字符,即使我的输入有错误信息(因为超过10个字符)表单也一定是无效的。我真的不知道如何在模板表单中添加这样的验证......我尝试了很多解决方案,但它们都是基于添加新指令。也许您有一些事情如何在输入超过 10 个字符时禁用按钮?我可以写类似 `[disabled]='one.value.length>10 && two.value.length>10' 之类的东西,但这不是一个好的解决方案,因为我需要检查所有输入的值(可能来自 5至 7)
    • 您可以使用引用变量onetwo(它们是FormControls)来执行诸如使用one.errors.required 或one.hasError('必需的')。请参阅link 了解更多信息。您的OK 按钮的残疾是否仅基于这两个字段(一个和两个)?如果没有,也许你可以使用[attr.disabled] = myExForm.invalid ? 'disabled' : ' '
    • 我想我提供了一个错误的解释。我需要检查字符的错误,但我不能,因为我不知道如何。我现在正在厌倦这样的事情:this.ngForm.form.valueChanges.subscribe(form =&gt; {console.log('f', form)} 并且从该函数中我可以看到值并可能对它们做一些事情。感谢您的时间和回答:)
    • 尝试在您的 HTML 中打印 {{ ex.name }}。它应该向您显示更新的值,您可以使用 ngModelChange 事件发射器来对我怀疑是否有必要的更改做出反应。
    【解决方案3】:

    我做了什么:

     <form
        class="my_ex_form"
        #myExForm="ngForm"
        novalidate>
        <div class="input">
          <label class="required">One</label>
          <input
            ngxTrim='keyup'
            required
            #one="ngModel"
            name="one"
            [(ngModel)]="ex.name"
            placeholder="Enter...">
          <span *ngIf="errMsg" class="error-text">Max length 10 characters.</span>
        </div>
       <div class="input">
          <label class="required">Two</label>
          <input
            ngxTrim='keyup'
            required
            #two="ngModel"
            name="two"
            [(ngModel)]="ex.nameTest"
            placeholder="Enter...">
          <span *ngIf="errSecMsg" class="error-text">Max length 10 characters.</span>
        </div>
        <div>
         <button
            type="submit"
            [disabled]="invalidValue()"
            class="btn btn-short"
            (click)="validate(myExForm)">
            ok
          </button>
        </div>
        </form>
    

    我的组件是:

       errMsg = false;
       errSecMsg = false;
       formChangesSubscription: any;
    
       ngOnInit() {
            this.checkChanges();
          }
    checkChanges() {
        this.formChangesSubscription = this.ngForm.form.valueChanges.subscribe(form => {
          this.errMsg = form.name && form.name.length > 10;
          this.errSecMsg = form.nameTest && form.nameTest.length > 10;
        });
      }
    

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多