Angular NgForm:重置确切的表单字段值不会使其有效

2024-05-07

我在组件模板上有一个表单:

<form (ngSubmit)="submitLogin(loginForm)" #loginForm="ngForm">
  <mat-input-container>
    <input matInput [placeholder]="'User Name'" ngModel name="username" autofocus required>
  </mat-input-container>
  <br>
  <mat-input-container>
    <input matInput [placeholder]="'Password'" ngModel type="password" name="password" required>
  </mat-input-container>
  <br>
  <button [disabled]="loginForm.invalid" mat-raised-button type="submit">
    Login
  </button>
</form>

这是我的组件的提交处理程序:

public submitLogin(loginForm: NgForm) {
  return this.authService.login(loginForm.value)
    .subscribe(
      res => this.router.navigate(['/customers']),
      error => loginForm.controls.password.reset() // this place!
    );
}

它有效并且在登录错误(传递一些随机值)时我看到

Question。如何重置表单上的确切字段并使其真正原始且未受影响?所以它应该是有效的,而不需要在 UI 上用红色“无效”边框标记它。

就在之后loginForm.controls.password.reset()我看到loginForm.controls.password.touched is false and loginForm.controls.password.pristine is true,但我也看到了loginForm.controls.password.status is "INVALID”。如果我破解它并直接分配“VALID“ 的价值status属性时,红色无效边框消失,但如果我专注于该字段,然后在没有任何输入的情况下消失,它会破坏失去焦点的无效状态。应该有一种合法的方式来重置提交的表格并使其同时有效。


这似乎是一个已知问题。根据this https://github.com/angular/material2/issues/4190#issuecomment-305222426错误状态计算如下:

isInvalid && (isTouched || isSubmitted)

因此,当您提交表格后,isSubmitted标志设置为true,因此满足条件并且您的字段显示为红色。有一些解决方法,如果您要重置整个表单,您可以使用resetForm相反,但在这里您只想重置一个字段,所以......

有一个建议 https://github.com/angular/material2/issues/7522#issuecomment-334478881 to use ErrorStateMatcher https://material.angular.io/components/input/overview#changing-when-error-messages-are-shown:

<input matInput 
   [placeholder]="'Password'" 
   ngModel type="password" 
   name="password" required 
   [errorStateMatcher]="matcher">

错误状态匹配器:

export class MyErrorStateMatcher implements ErrorStateMatcher {
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
    // show errors when touched and invalid
    return (control.invalid && control.touched);
  }
}

并在你的 TS 中声明一个 ErrorStateMatcher:

matcher = new MyErrorStateMatcher();

似乎有效:堆栈闪电战 https://stackblitz.com/edit/angular-hbq2uv-qi5pbr?file=app/input-error-state-matcher-example.ts

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular NgForm:重置确切的表单字段值不会使其有效 的相关文章

随机推荐

  • 判断正则表达式是否只匹配固定长度的字符串

    有没有办法确定正则表达式是否只匹配固定长度的字符串 我的想法是扫描 和 然后 需要一些智能逻辑来查找 m n 其中 m n 没有必要采取 考虑到运营商 小例子 d 4 是固定长度 d 4 5 或 d 是可变长度 我正在使用PCRE Than
  • 找不到 com.mapbox.mapboxsdk:mapbox-android-accounts:0.7.0。全新安装 MapBox

    我建立了一个新的反应本机项目并添加了 Mapboxyarn add react native mapbox gl maps This 请注意 如果您使用默认的 Mapbox Android SDK 包含在此库中 并且使用较新的 Androi
  • H2数据库排序规则:选择什么?

    经过大量阅读和实验后 似乎我想要主要的搜索强度 但第三或相同的排序强度 主要问题 用 H2 或任何其他数据库 可以实现吗 第二个问题 我是这里唯一的人吗 或者你们中有人也喜欢上述组合吗 一些确认会对我的理智有所帮助 背景 看来排序规则只能在
  • 发布预编译的 ASP.net-MVC VS2010

    我找到了几个使用构建后事件的解决方案 有没有办法publishASP NET MVC 网站带有编译视图 以防止第一个用户查看延迟 但是不编译 them 在开发环境中 更快地编译网站 谢谢你 附 理想情况下 在 Visual Studio 2
  • ASP.NET MVC 5 基于用户角色自定义 Bootstrap 导航栏

    我正在使用 ASP NET MVC 5 内置身份验证方法 我想根据用户所处的角色显示和隐藏链接 在菜单导航栏中 有人达到这个目的了吗 从哪里开始 只需将您的链接包含在 if User IsInRole SomeRole
  • 如何从 Kubernetes 服务背后的 HTTP 请求读取客户端 IP 地址?

    我的 Web 应用程序作为 Kubernetes pod 在 SSL 的 nginx 反向代理后面运行 代理和我的应用程序都使用 Kubernetes 服务进行负载平衡 如所述here http blog kubernetes io 201
  • 如何使用 Android 管理 API 静默推送 apk 并通过 Android 设备策略安装它?

    我正在尝试将 APK 推送到设备并通过 Android 设备策略 设备所有者 安装它 而不是从 Play 商店推送应用程序 我可以使用以下方式推送 Play 商店上可用的应用程序 设备策略 packageName string instal
  • 用简单的英语来说,什么是单例?

    我已经在谷歌上搜索了大约一个小时 但我仍然不清楚什么是单例 谁能让我更清楚一点 也许可以发布一个代码示例 我所知道的是 一个给定类只能有一个实例 但是你不能为此使用静态类吗 提前致谢 The simple plain English1 ve
  • 如何使用 PHP mysqli 增加 MySQL 中的值

    我在 MySQL 表中有一个整数列 名为col1 现在 我需要的是将其值增加某个数字 例如 1 可能是 2 3 或任何数字 也就是说 如果它的值已经是 10 现在我希望它变成 11 我知道 我可以通过首先选择原始值 用 PHP 增加它 然后
  • 在不知道对象键的情况下进行 Cosmos DB 查询

    单个文档示例 id xxxxxx properties a prop type names value John b prop type score value 5 5 c prop type names value Steve 问题 如何
  • 如何在nodejs中获取字符串长度(以字节为单位)?

    如何在nodejs中获取字符串长度 以字节为单位 如果我有一个字符串 像这样 那么 str length 将返回 4 但是如何获得该字符串 有多少字节组成 这是一个例子 str console log str str length char
  • 在表单提交时发送 div 的值

    我正在尝试提交一个包含几个不同输入的表单 这些输入都工作正常 然而 输入之一是文本区域 某种程度 我必须将其更改为内容可编辑的 div 主要是因为我创建了自己的粗体 斜体和下划线按钮 这些按钮不适用于普通文本区域 问题是提交时的表单没有将文
  • 多处理与 gevent

    目前我正在使用带有发布 订阅模式的 Zeromq 我有一个要发布的工作人员和许多 8 个订阅者 所有人都会订阅 相同的模式 现在我尝试使用多处理来生成订阅者 它可以工作 我错过了一些消息 我使用多重处理的原因是在每条消息到达时对其进行处理
  • 如何在rescue_from中渲染500页

    我想在我的应用程序出现异常时发送电子邮件并呈现常规 500 页 我找不到如何执行 500 页渲染 class ApplicationController lt ActionController Base rescue from Standa
  • Python 中的随机优化

    我正在尝试结合cvxopt http cvxopt org 优化求解器 和PyMC https github com pymc devs pymc 采样器 解决凸问题随机优化问题 作为参考 安装这两个软件包pip很简单 pip instal
  • 弃用警告:ActionView::Base 实例应使用查找上下文、赋值和控制器来构造

    我将应用程序从 Rails 5 2 迁移到 Rails 6 只剩下一件事要做 但我不知道如何做 我有这个弃用警告 弃用警告 ActionView Base 实例应使用查找上下文 赋值和控制器来构造 从 Users xxx xxxx app
  • 从 Task.WhenAll 获取返回值

    希望这里是一个相当简单的 我有一个对象集合 每个对象都有一个我想调用并从中收集值的异步方法 我希望它们并行运行 我想要实现的目标可以用一行代码来概括 IEnumerable
  • R xts:毫秒索引

    如何创建索引包含毫秒的 xts 对象 我在 POSIXlt 帮助页面中找不到任何格式规范 但有一个参考 https stackoverflow com questions 4295407 display time index in r xt
  • 使用 CSS 更改悬停时的 SVG 链接对象填充

    我的页面上有一个 SVG 对象链接 a href target blank gmail a 我正在尝试使用 SVG 文件中的以下代码更改悬停时的填充颜色 问题是 悬停效果仅在我删除
  • Angular NgForm:重置确切的表单字段值不会使其有效

    我在组件模板上有一个表单