ng-zorro+angular中 input输入框设置disabled属性无效的解决方法

错误描述

ng-zorro是遵循Ant Design设计规范的Angular UI组件库,前端开发中angular + ng-zorro结合使用可以事半功倍。

今天在开发过程中发现ng-zorro的一个坑,当我给input输入框设置disabled属性时,无论disabled的值为true或者false都没有效果

经过多番调查发现,在ng-zorro中使用disabled属性时,disabled属性时灵时不灵,具体有以下几种情况:

1、disabled属性与ngModel同时使用时,disabled效果正常

<input type="text" nz-input placeholder="请输入" [(ngModel)]="searchValue" [disabled]="true" />

2、disabled单独使用时,效果正常

 <input type="text" nz-input placeholder="请输入" [disabled]="true" />

3、disabled属性与fromControlName同时使用时,disabled属性无效

<input nz-input formControlName="count" placeholder="请输入数量" [disabled]="true" />

ngModel和formGroup不可以同时在一个input上使用,所以在fromControlName这种情况下,我们无法在input节点上直接使用disabled属性设置输入框是否readonly。

错误原因

经过调查发现,angular 更希望开发者通过给 fromControl 实例设置 disabled 来禁用它,而不是在它上面绑定[disabled]属性!而且这时候其实 angular 是会给我们报一个警告信息的,只不过大部分开发者日常开发中不会关注waring。
在这里插入图片描述

解决方法1

disabled属性失效的情况是在angular中使用了响应式表单FormGroup时出现的,使用FormGroup时,我们必须在代码中对响应式表单进行初始化,我们可以在这时对input设置disabled。

<form nz-form  [formGroup]="from" (ngSubmit)="submitForm()">
  <nz-form-item>
    <nz-form-control nzErrorTip="Please input your username!">
      <nz-input-group nzPrefixIcon="user">
        <input formControlName="userName" nz-input placeholder="Username"  />
      </nz-input-group>
    </nz-form-control>
  </nz-form-item>
</form>
from: FormGroup;
constructor(  private fb: FormBuilder) {}
 this.validateForm= this.fb.group({
   userName: [{value:null,disabled: true}, [Validators.required]],
 });
解决方法2

这种方法和方法1相识,通过controls对相应的表单项进行操作:

this.from.controls.userName.disable(); // 设置readonly
this.from.controls.userName.enable(); //取消readonly
解决方法3

除了angular推荐的解决方法之外,我们还可以使用Angular中的renderer2指令进行DOM操作。

<input nz-input formControlName="count" placeholder="请输入数量" id = "inp"/>
constructor(
    private renderer2: Renderer2) {}
    
// 下面两种方式都可以,区别在于获取DOM对象的方式
this.renderer2.setAttribute(document.getElementById('inp'), "disabled", "true");
this.renderer2.setAttribute(this.renderer2.selectRootElement("#inp"), "disabled", "true");

//移除disabled属性
this.renderer2.removeAttribute(this.renderer2.selectRootElement("#inp"), "disabled");

Render2 是angular中用于操作DOM的,Angular做了封装,屏蔽底层差异,通用性更强。除了setAttribute\removeAttribute两个方法之外还有一系列操作DOM的方法,具体可以登录renderer2官方文档查询。

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值