【问题标题】:Why the angular form validation works partially?为什么角度形式验证部分有效?
【发布时间】:2020-01-10 13:34:04
【问题描述】:

我的代码位于here

当按钮被按下时,网页会弹出一个模式。

问题是:

  1. 在“分部”中选择一项
  2. 在“系统”下拉框中选择一个项目。
  3. 应该显示“form.valid=true”
  4. 清空“分部”输入框,则“系统”下拉框清空。
  5. 虽然错误信息显示为“需要部门名称”, 消息“form.valid=true”仍会显示。

我希望显示消息“form.valid=false”,但是,它显示消息“form.valid=true”。 我该如何解决这个问题?

【问题讨论】:

  • app-division-list-input-box组件(表单控件组件)上没有设置验证器,所以不可能无效(即使matInput那个表单控制组件内部使用无效)。简而言之,required 属性应该在 app-division-list-input-box 上设置,而不是在其内部 matInput 上。
  • 在您的第四点中,您说清除“除法”输入框也清除了您的下拉框。但实际上并非如此,如果您以一种方式而不是逐个字母地清除除法输入,您将看到系统输入仍然被写入。当您的除法输入清晰时,您需要找到一种真正清除系统输入的方法。希望我对这个解释很清楚

标签: angular angular-directive angular-forms


【解决方案1】:

虽然 JB Nizet 的评论非常准确,但我认为你的解决方案还有一步。

使用ControlValueAccessor 时,您为组件(app-division-list-input-box) 提供了一种与Forms API 通信的方式。

因此,您希望在输入中具有必需属性,该属性位于app-division-list-input-box'中的观点。那是因为input 只是一个 DOM 元素,但它并不直接与其父表单容器通信。 因此,您应该在app-division-list-input-box 上定义required 验证器,以便定义必需的验证器

manual-contact-editor.component.html

<app-division-list-input-box
    name="division"
    [(ngModel)]="this.callTreeManualContactMapping.division"
    required
    [divisionList]="this.divisionList">
  </app-division-list-input-box>

但是,这还不够。

因为,当您更改input 的内容时,app-division-list-input-box 不会通知其父表单容器。

每当用户在输入中键入内容时,您都必须调用onChange

division-list-input-box.component.html

<mat-form-field>
    <mat-label>Division</mat-label>
    <input 
        matInput 
        type="text" 
        [(ngModel)]="division" 
        (ngModelChange)="onChange($event)"
        [matAutocomplete]="divisions"
        name="division2" 
        [divisionValidator]="this.divisionList" 
        (ngModelChange)="autoCompleteFilter($event)"
        #division2="ngModel"
    >
    <!-- ... -->
</mat-form-field>

StackBlitz.

【讨论】:

  • 感谢您的解释。为什么我需要再定义 1 个 (ngModelChange) 处理程序?我试过追加“this.onChange(evt);”进入 autoCompleteFilter($event) 方法的末尾,但它仍然不起作用。
  • @HKKNVB 在您的模板中添加&lt;pre&gt;{{ manualContactEditForm.value | json }}&lt;/pre&gt;,您会看到即使您删除了除法中的最后一个字符,它也不会正确地通知表单该值现在为空。相反,它保留最后一个字符。
  • @JB 我也发现了这种情况,但是不知道怎么解决。
  • 好吧,你只在 else 子句中调用 this.onChange(evt);,当 evt 不是假的。无论值是什么,您都需要调用它。
  • @HKKNVB,提供的 StackBlitz 演示不是解决您的问题吗?它似乎工作正常
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多