无法使用 [formControlName] 禁用 matInput 元素

2024-04-04

我在用着matInput and mat-form-field(@angular/material) 在 Angular 组件中,我无法禁用matInput.

可以在这里看到一个工作示例。 https://stackblitz.com/edit/angular-7ceq7v

我似乎错过了一些明显的东西,但我一生都无法弄清楚是什么。这是一个错误吗?

如果我删除[formControlName]来自CustomFormInputComponent,然后我可以成功禁用matInput

CustomFormInputComponent:

import { Input, Component } from '@angular/core';
import { FormGroup } from '@angular/forms';

@Component({
  selector: 'app-custom-form-input',
  template: `
    <mat-form-field [formGroup]="form">
      <input matInput placeholder='Name' [formControlName]="formControlName" [disabled]='disabled'>
    </mat-form-field>
  `,
})
export class CustomFormInputComponent  {
  @Input() form: FormGroup;
  @Input() formControlName: string = 'name';
  @Input() disabled = false;
}

AppComponent:

import { Component } from '@angular/core';
import { FormBuilder } from '@angular/forms';

@Component({
  selector: 'my-app',
  template: `
    <p>At least one of these inputs should be disabled, but none are :(</p>

    <app-custom-form-input [form]="form" [disabled]='true'></app-custom-form-input>

    <app-custom-form-input [form]="form" [disabled]="'disabled'"></app-custom-form-input>
  `,
})
export class AppComponent  {
  public form: any;

  constructor(private fb: FormBuilder) {}

  ngOnInit() {
    this.form = this.fb.group({
      name: ''
    })
  }
}

任何见解都将不胜感激!

Answer

有关 David 答案的更多背景信息:Angular 根据反应式表单控件的禁用状态更新 DOM 状态。我认为正在发生的事情:角度正在渲染CustomFormInputComponent之前AppComponent并将组件呈现为禁用状态。然后AppComponent被渲染并且form是用name控制启用。然后 Angular 取消禁用 DOM 输入元素(这是设计的行为)。


如果您使用 FormGroup,则不应禁用 HTML 模板中的表单。如果您尝试在 HTML 中与 FormControl 一起禁用,它将不起作用。相反,它应该在 FormGroup 内完成。尝试这个:

  template: `
    <mat-form-field [formGroup]="form">
      <input matInput placeholder='Name' [formControlName]="formControlName">
    </mat-form-field>
  `

and:

ngOnInit() {
    this.form = this.fb.group({
        name: new FormControl({ value: '', disabled: this.disabled })
    });
}

另外......没什么大不了的,但是......你真的应该这样做:

public form: FormGroup;

代替:

public form: any;

不要忘记导入

import { FormGroup, FormControl } from '@angular/forms';

顺便说一句,表单组声明中的名称应与您在 HTML 中设置的名称相匹配。 所以:

<input formControlName="myInputName">

and

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

无法使用 [formControlName] 禁用 matInput 元素 的相关文章

随机推荐

  • 使用 appium 自动登录过程时,密码和用户名被输入在用户名的同一字段中

    尽管测试清晰简单 但我在尝试发送密钥 用户名 密码 时总是面临同样的问题 但密码字段是写在用户名的位置 这是我的测试 NG 我使用 appium 进行测试 Test public void Test1 throws InterruptedE
  • 将 iOS 和 Android 客户端连接到 SockJS 后端

    我正在使用开发 WebSocket 消息传递后端Spring WebSockets https spring io guides gs messaging stomp websocket 它使用SockJS STOMP协议 之所以不使用普通
  • 通过 SSO 进行 Maven 设置?

    我有一些开发人员对于将 LDAP 用户名 密码存储在 settings xml 中以便访问 Nexus 感到不满意 他们的不满部分是出于 FUD 但也因为每当 LDAP 密码过期时都必须重新加密密码 这种情况在此处相对常见 带来的不便 有什
  • Airflow:只有一项任务的简单 DAG 永远不会完成

    我制作了一个非常简单的 DAG 如下所示 from datetime import datetime from airflow import DAG from airflow operators bash operator import B
  • 服务器显示文本而不是 HTML

    我正在尝试创建一个 C 服务器 它将接受输入并能够通过 html 格式将它们返回给用户 其中服务器充当用户界面 我当前的问题似乎无法弄清楚为什么 C 服务器在 localhost 3838 处将 HTML 代码以文本形式吐出 而不是将其显示
  • 在 PHP 中,为什么“or die()”可以工作,而“or return”却不行?

    在 PHP 中 您可以通过调用来处理错误or die当遇到某些错误时退出 如下所示 handle fopen location r or die Couldn t get handle Using die 不是处理错误的好方法 我宁愿返回一
  • C# 服务器和 Java 客户端:TCP 套接字通信问题

    我用 C 编写了一个服务器程序TCPListner和一个使用套接字的 Java 客户端程序 但我无法将复杂的对象从 Java 客户端发送到 C 服务器 当我通过将字符串转换为字节数组从 Java 客户端发送到 C 服务器时 当转换回字符串时
  • Ansible设置mysql root密码

    你们中有人有想法构建一个 yml 用于 mysql 更新 root 密码并授予权限吗 我已经创建了我的剧本 并且在全新安装时它按预期工作 完全没有问题 但是 当我再次进行 vagrant 配置时 它现在无法设置 root 密码 并且出现错误
  • 按排序顺序将元素插入数组

    我正在尝试按排序顺序将元素添加到数组中 这是我的代码 public class SortedInsertion public static void main String args int arr new int 6 arr 0 5 ar
  • LINQ如何返回最后一个日期以及第一个和最后一个计数之间的差异

    我有一个包含以下列和示例数据的表 acteename updated at count count is not sorted in db dev 52 2 7 2020 5 56 43 PM 1 dev 52 2 7 2020 5 56
  • 根据 Woocommerce 中的特定产品数量渐进式固定优惠券折扣

    我有一个小问题 不知道如何解决自己 我想在我的 Woocommerce 商店中仅针对一种产品使用此逻辑 我使用这样的链接来自动应用优惠券代码并添加到购物车 https testsite com checkout add to cart Pr
  • Videojs仅添加播放控件

    我在用Video js在我的网页中播放视频 我想将播放器控件自定义为仅播放按钮 我的代码是
  • 如何构建/编译 ndk 应用程序?

    嗨 现在我正在下载 ndk 但我不知道如何构建和编译 实际上我是 Android 应用程序的新手 现在我正在使用 linux 并且我不太擅长命令行 embdes embdes laptop cd home embdes projects a
  • 如何从简单的 jsdom 函数返回值?

    我将 jsdom 与 jquery 一起使用 并且运行得很好 然而 我试图将我的代码模块化一点 这样我就不会重复自己 所以我用一些 jsdom 代码创建了一个基本函数 它接受一些 html DOM 用 jquery 调整它 然后将其吐出来
  • AngularJS:避免在收到响应之前两次调用相同的 REST 服务

    我有两个指令 每个指令都使用包装 q http 调用的同一工厂 angular module demo directive itemA restService function restService return restrict A l
  • 张量流中的批量归一化

    我注意到张量流的 api 中已经有批量归一化函数 但我不明白的一件事是如何更改训练和测试之间的程序 批量归一化在测试期间的行为与训练期间的行为不同 具体来说 在训练期间使用固定的均值和方差 某处有一些好的示例代码吗 我看到了一些 但是对于作
  • 在 PHPUnit 中进行模拟时,通过回调中的引用传递

    我有一个想要模拟的接口 并模拟其方法之一的行为 所以我创建了一个回调来非常简单地模拟行为 如果我创建一个基于此接口的新对象 但我想模拟该接口 则此测试通过 模拟的 setUp 方法被正常调用 并且在回调中调用 getVar testing
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小
  • PHP 日期时间大于今天

    请帮忙我的代码有什么问题吗 它始终返回今天的日期大于 01 02 2016 其中 2016 年大于 2015 年
  • 无法使用 [formControlName] 禁用 matInput 元素

    我在用着matInput and mat form field angular material 在 Angular 组件中 我无法禁用matInput 可以在这里看到一个工作示例 https stackblitz com edit ang