Angular2 - 动态更改 类
Angular2 - Changing classes dynamically
我的组件中的表单中重复出现以下代码:
<div class="form-group row">
<label class="col-sm-4 col-form-label" for="description">Description</label>
<input class="form-control form-control-lg"
id="description"
type="text" placeholder="..."
formControlName="description"
[ngClass]="{
'form-control-warning': descriptionCtrl.untouched && descriptionCtrl.invalid,
'form-control-success': descriptionCtrl.valid,
'form-control-danger': descriptionCtrl.touched && descriptionCtrl.invalid }">
</div>
... Another "blocks" with the same code
因此,为了简化这一点,我创建了以下 方法 :
handleClass = (control: AbstractControl): any => {
if (control.valid) {
return 'form-control-success';
} else {
if (control.touched) {
return 'form-control-danger';
} else {
return 'form-control-warning';
}
}
}
在模板中:
[ngClass]="handleClass(control)"
但这仍然不是我想要的,因为我需要在 所有 组件上创建此方法。我正在寻找一种动态执行此操作的通用方法。
PS: 我项目中的所有输入都与上面的输入规则相同。
完成此任务的最佳方法是什么?我希望我的问题足够清楚。
写一个指令来处理这个问题,像这样:
@Directive({ selector: '[formValidBorders]'})
export class FormValidBorders implements OnChanges {
@Input('formValidBorders') formValue: AbstractControl;
constructor(private el: ElementRef) { }
ngOnChanges(){
this.el.nativeElement.className = this.handleClass(formValue);
}
private handleClass(control: AbstractControl) {
if (control.valid) {
return 'form-control-success';
}
else if (control.touched) {
return 'form-control-danger';
}
else {
return 'form-control-warning';
}
}
}
然后在你的元素上:
<input class="form-control form-control-lg"
id="description"
type="text" placeholder="..."
formControlName="description"
[formValidBorders]="form.get('description')">
像这样的东西应该可以工作,当然还有进口。
我的组件中的表单中重复出现以下代码:
<div class="form-group row">
<label class="col-sm-4 col-form-label" for="description">Description</label>
<input class="form-control form-control-lg"
id="description"
type="text" placeholder="..."
formControlName="description"
[ngClass]="{
'form-control-warning': descriptionCtrl.untouched && descriptionCtrl.invalid,
'form-control-success': descriptionCtrl.valid,
'form-control-danger': descriptionCtrl.touched && descriptionCtrl.invalid }">
</div>
... Another "blocks" with the same code
因此,为了简化这一点,我创建了以下 方法 :
handleClass = (control: AbstractControl): any => {
if (control.valid) {
return 'form-control-success';
} else {
if (control.touched) {
return 'form-control-danger';
} else {
return 'form-control-warning';
}
}
}
在模板中:
[ngClass]="handleClass(control)"
但这仍然不是我想要的,因为我需要在 所有 组件上创建此方法。我正在寻找一种动态执行此操作的通用方法。
PS: 我项目中的所有输入都与上面的输入规则相同。
完成此任务的最佳方法是什么?我希望我的问题足够清楚。
写一个指令来处理这个问题,像这样:
@Directive({ selector: '[formValidBorders]'})
export class FormValidBorders implements OnChanges {
@Input('formValidBorders') formValue: AbstractControl;
constructor(private el: ElementRef) { }
ngOnChanges(){
this.el.nativeElement.className = this.handleClass(formValue);
}
private handleClass(control: AbstractControl) {
if (control.valid) {
return 'form-control-success';
}
else if (control.touched) {
return 'form-control-danger';
}
else {
return 'form-control-warning';
}
}
}
然后在你的元素上:
<input class="form-control form-control-lg"
id="description"
type="text" placeholder="..."
formControlName="description"
[formValidBorders]="form.get('description')">
像这样的东西应该可以工作,当然还有进口。