Angular2-动态更改类
在我的组件中,我的表单中反复出现以下代码:Angular2-动态更改类,angular,angular2-directives,Angular,Angular2 Directives,在我的组件中,我的表单中反复出现以下代码: <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" plac
<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
在模板中:
[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')">
当然,对于导入,类似的方法应该可以使用。编写一个指令来处理此问题,如下所示:
@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')">
类似的方法当然可以用于导入。了解指令,这是一种操作dom元素的强大方法。因此,您基本上可以获取dom元素并执行任何您想执行的操作。()了解指令,这是一种操作dom元素的强大方法。因此,基本上您将获得dom元素并执行任何您想执行的操作。()请删除返回类型批注,
any
在这里是绝对错误的。此外,这也没有任何意义,因为您没有对结果做任何处理。@AluanHaddad我不小心保存了错误的答案副本,更新后的答案已就位。您使用的返回类型是any
,返回的是什么?(提示如果你让编译器完成它的工作,编译器最清楚)哦!对不起,我是从他的问题中抄来的。这不需要返回类型。对,通常最好让它在另一种情况下也推断出类型。它总是比使用任何更好。因此,在任何一种情况下,您都可以省略返回类型,顺便说一句,在更新的答案中,返回类型为void
。请删除返回类型注释,any
在这里绝对错误。此外,这也没有任何意义,因为您没有对结果做任何处理。@AluanHaddad我不小心保存了错误的答案副本,更新后的答案已就位。您使用的返回类型是any
,返回的是什么?(提示如果你让编译器完成它的工作,编译器最清楚)哦!对不起,我是从他的问题中抄来的。这不需要返回类型。对,通常最好让它在另一种情况下也推断出类型。它总是比使用任何更好。因此,在任何一种情况下,您都可以省略返回类型,顺便说一句,它在更新的答案中是void
。