typescript - 如何在 Angular2 Typescript 中更改 HTML 元素只读和必需属性?

标签 typescript angular

对于我的一些组件,我想来回更改输入字段只读和必需的属性。

我已经设法获得了一个运行代码,它可以根据需要更改它们,但问题是它只适用于只读,但似乎不适用于必需的:尽管元素属性更改为必需的 Angular2 仍然认为 fieldCtrl 是有效。

这是我的 plunker,我在其中说明了这个问题:https://plnkr.co/edit/Yq2RDzUJjLPgReIgSBAO?p=preview

//our root app component
import {Component} from 'angular2/core'

@Component({
  selector: 'my-app',
  providers: [],
  template: `
    <div>
    <form #f="ngForm">
      <button type="button" (click)="toggleReadOnly()">Change readonly!</button>
      <button type="button" (click)="toggleRequired()">Change required!</button>
      <input id="field" [(ngModel)]="field" ngControl="fieldCtrl" #fieldCtrl="ngForm"/>
      {{fieldCtrl.valid}}
    </form>
    </div>
  `,
  directives: []
})
export class App {
  constructor() {
    this.name = 'Angular2'
  }

  toggleRequired(){
    this.isRequired = !this.isRequired;
    var fieldElement = <HTMLInputElement>document.getElementById('field');
    if (this.isRequired){
      fieldElement.required = true;
      this.field = "it's required now";
    }
    else{
      fieldElement.required = false;
      this.field = "can leave it blank";
    }
  }

  toggleReadOnly(){
    this.isReadOnly = !this.isReadOnly;
    var fieldElement = <HTMLInputElement>document.getElementById('field');
    if (this.isReadOnly){
      fieldElement.readOnly = true;
      this.field = "it's readonly now";
    }
    else{
      fieldElement.readOnly = false;
      this.field = "feel free to edit";
    }
  }

  private isReadOnly:boolean=false;

  private field:string = "feel free to edit";

  private isRequired:boolean=false;

}

更新: 尝试了建议的方法

[required]="isRequired" [readonly]="isReadOnly"

对于只读和 required=true,它就像一个魅力,但我不能再关闭 required 属性 - 它显示空字段无效,尽管不再需要。

更新的插件:https://plnkr.co/edit/6LvMqFzXHaLlV8fHbdOE

更新 2: 尝试了建议的方法

[required]="isRequired ? true : null"

它确实按需从元素中添加/删除必需的属性,但是对于不需要的空字段,字段 Controller 的有效属性显示为 false。

在 Angular2 Typescript 中更改必需属性的正确方法是什么?

最佳答案

要删除绑定(bind)属性,需要将它们设置为空。曾讨论过将其更改为在 false 时删除,但被拒绝了,至少目前是这样。

 [required]="isRequired ? '' : null"

 [required]="isRequired ? 'required' : null"

由于缺少 ngControl 周围的 [],您的 Plunker 会产生错误。

另见 Plunker一个工作示例

另请参阅下面 Deilan 的评论。

关于typescript - 如何在 Angular2 Typescript 中更改 HTML 元素只读和必需属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35212475/

相关文章:

html - 如何使用 Angular 在新选项卡中打开链接?

Typescript 编译器 noResolve 选项不起作用

javascript - 迭代按钮点击 Angular 5 上的 api 数据

angular - 如何将 console.log 值传递给 protractor-jasmine2-screenshot-reporter

javascript - 根据源对象是否具有具有特定值的深度嵌套属性,有条件地渲染 JSX 元素

node.js - 让 ngPrime 为 Angular 2 工作

android - 如何在 iOS/Android 中嵌入 NativeScript Angular 应用程序并从现有应用程序导航到某些路线

Angular Testing 如何防止 ngOnInit 调用直接测试方法

javascript - 如何使用 typescript 输入生成器函数

javascript - 在订阅功能之外无法访问数据