Для некоторых моих компонентов я хотел бы изменить исходное поле readonly и необходимые атрибуты взад и вперед.
Мне удалось получить исполняемый код, который изменяет оба из них по требованию, но проблема в том, что он работает только для чтения, но, похоже, не работает над требуемым: хотя атрибут элемента изменяется на требуемый Angular2, все еще думает fieldCtrl действителен.
Вот мой плункер, где я проиллюстрировал эту проблему: 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 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 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;
}
UPDATE: Пробовал предложенный метод
[required]="isRequired" [readonly]="isReadOnly"
И он работает как прелесть для readonly и для required = true, но я больше не могу отключить требуемый атрибут - он показывает, что пустое поле недопустимо, хотя и не требуется больше.
Обновлено плункер: https://plnkr.co/edit/6LvMqFzXHaLlV8fHbdOE
UPDATE2: Пробовал предложенный метод
[required]="isRequired ? true : null"
Он добавляет/удаляет требуемый атрибут из элемента по запросу, однако свойство допустимого полевого контроллера показывает false для пустого поля, которое не требуется.
Каким будет правильный способ изменения требуемого атрибута в Angular2 Typescript?