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