如何禁用angular2中的输入


123

在TS is_edit = true禁用...

<input [disabled]="is_edit=='false' ? true : null" id="name" type="text" [(ngModel)]="model.name" formControlName="name" class="form-control" minlength="2">

我只是想基于true或禁用输入false

我尝试了以下操作:

[disabled]="is_edit=='false' ? true : null"
[disabled]="is_edit=='true'"
[disabled]="is_edit"

10
您已经问过这个问题,并且已经有了答案,但是随后删除了该问题。再次,打开浏览器控制台以注意到错误,进行修复(即使用名称而不是formControlName),然后,它可以正常工作:plnkr.co/edit/al2IkGkaZKpdLKKTfvKh?p=preview
JB Nizet

真正的问题是,您要将基于模板的表单与响应表单混合在一起。使用一个或另一个,不要同时使用。@ AJT_82有正确答案。
adam0101 '18

Answers:


316

尝试使用attr.disabled,而不是disabled

<input [attr.disabled]="disabled ? '' : null"/>

5
将attr值设置为null以便不将attr添加到元素-看起来很hack-但是事后看来,它实际上是有效的,甚至是明智的。
c69

2
disabled等于truefalse
Belter

18
感谢您提供的有效答案!那么为什么不attr.disabled工作disabled呢?
Dylanthepiguy

5
虽然这行得通,但它并没有解决将基于模板的表单与反应性表单混合的真正问题。OP应该使用一个或另一个,而不是同时使用。
adam0101 '18

2
<input [attr.disabled] =“ disabled || null” />我认为也可以
Francesco

41

我想我已经解决了这个问题,因为您已经包含,所以此输入字段是反应形式(?)的一部分formControlName。这意味着您要通过禁用输入字段来尝试执行的操作is_edit不起作用,例如您的try [disabled]="is_edit"可能在其他情况下有效。使用表格,您需要执行以下操作:

toggle() {
  let control = this.myForm.get('name')
  control.disabled ? control.enable() : control.disable();
}

is_edit完全失去。

如果要默认禁用输入字段,则需要将表单控件设置为:

name: [{value: '', disabled:true}]

这是一个小矮人


30

你可以简单地做到这一点

<input [disabled]="true" id="name" type="text">

1
尽管这样做有效,但它表明“ false”将启用控件,但不会启用,因为Disabled属性的存在是使控件失效的原因,而不是值。
Mecaveli

@Mecaveli,将[disabled]设置为false实际上会启用该控件。<input [disabled] =“ false” id =“ name” type =“ text”>启用输入字段。您可以检查您的角度应用程序。
Ifesinachi Bryan

1
只是为了纠正自己:据我了解,[disabled]实际上不像[attr.disabled]那样控制“ disabled” html属性值。因此,[disabled] =“ false”可以工作,尽管html属性“ disable”的值不能为“ false”。
Mecaveli

6
因此,总的来说,您应该实际使用编辑器并尝试一下,然后再提出一个对策。
Ifesinachi Bryan

的确,遗憾的是,遗憾的是现在不能撤消它。误用了[attr.disabled]了好几年的思维(或者说没有太多的思维),这等于[disabled] ...
Mecaveli

26

如果要在某些语句上禁用输入。使用[readonly]=truefalse代替禁用。

<input [readonly]="this.isEditable" 
    type="text" 
    formControlName="reporteeName" 
    class="form-control" 
    placeholder="Enter Name" required>

1
反应友好型解决方案。
约翰·迪尔

1
这是对的。对我来说[attr.disabled] =“ disabled”仅可单向工作,即输入保持在初始禁用/启用状态
Spiritworld

非常感谢你做的这些 !
纳齐尔

Nazir没问题
Usman Saleh

13
<input [disabled]="is_edit" id="name" type="text">
<button (click)="is_edit = !is_edit">Change input state</button>

export class AppComponent {
  is_edit : boolean = false;
}

1
如果将控制台日志放入isDisabled方法中,则将执行数百个控制台日志。如果isDisabled方法中包含复杂的逻辑,则可能是一个问题。因此,我不确定这是否是一个好的解决方案。
特瓦

1
不要将动态检查放入Angular变量中,否则会出现无限循环。您可以[disabled]="is_edit"直接使用。为什么要isDisabled()功能?
alex351 '19

更新代码以直接更改输入状态。
Yoav Schniederman

7

我想你的意思false不是'false'

此外,[disabled]正在期待Boolean。您应该避免返回null


4

由于我不具备添加评论的美誉,因此回应了贝尔特对联邦快递在上面接受的答案的评论。

根据Mozilla文档,对于我所知的任何情况,这都是不正确的

禁用等于真或假

存在禁用属性时,无论值如何,该元素均被禁用。看这个例子

<input placeholder="i can be changed"/>
<input disabled placeholder="i can NOT be changed"/>
<input disabled="true" placeholder="i can NOT be changed"/>
<input disabled="false" placeholder="i can NOT be changed"/>

3
对于纯Html,这是完全正确的,但对于有角度的,则必须为disable提供一个布尔值,尤其是在进行双向绑定时。
Ifesinachi Bryan

4

我更喜欢这种解决方案

在HTML文件中:

<input [disabled]="dynamicVariable" id="name" type="text">

在TS文件中:

dynamicVariable = false; // true based on your condition 

3

您正在寻找的是disabled =“ true”。这是一个例子:

<textarea class="customPayload" disabled="true" *ngIf="!showSpinner"></textarea>

6
这是不正确的,HTML和DOM disabled属性是“布尔属性”,这意味着仅需要指定属性名称-或其值必须等于disabled,例如disabled="disabled" - it does not recognize the values of true或false- disabled="false"仍将导致元素被禁用。

2

演示版

使is_edit布尔型的。

<input [disabled]=is_edit id="name" type="text">

export class App {
  name:string;
  is_edit: boolean; 
  constructor() {
    this.name = 'Angular2'
    this.is_edit = true;
  }
}

2

在Angular 7中禁用文本框

<div class="center-content tp-spce-hdr">
  <div class="container">
    <div class="row mx-0 mt-4">
      <div class="col-12" style="padding-right: 700px;" >
          <div class="form-group">
              <label>Email</label>
                <input [disabled]="true" type="text" id="email" name="email" 
                [(ngModel)]="email" class="form-control">
          </div>
     </div>
   </div>
 </div>



0

Select在角度9中已禁用。

请记住,boolean在此示例中禁用了使用值的操作,如果未选择国家/地区,则我将(change)事件与select选项一起使用。

find.component.ts文件

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-find',
  templateUrl: './find.component.html',
  styleUrls: ['./find.component.css']
})
export class FindComponent implements OnInit {
  isCountrySelected:boolean;

  constructor() { }
  //onchange event disabled false
 onChangeCountry(id:number){
   this.isCountrySelected = false;
 }
  ngOnInit(): void {
    //initially disabled true
    this.isCountrySelected = true;
  }

}

find.component.html

//Country select option
<select  class="form-control"  (change)="onChangeCountry()" value="Choose Country">
                    <option value="">Choose a Country</option>
                    <option value="US">United States</option>
                     
</select>
//region disabled till country is not selected 
<select class="form-control" [disabled]="isCountrySelected">
                    <option value="">Choose a Region</option>
                    <option value="">Any regions.</option>
                    
                </select>

-1

可以简单地使用

     <input [(ngModel)]="model.name" disabled="disabled"

我是这样子的。所以我更喜欢。


这不是动态设置禁用的属性
Benjineer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.