2017-03-02 77 views
0

我有我的组件内重复下面的代码在我的形式:Angular2 - 更改类动态

<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)" 

然而,这是STIL l不是我想要的,因为我需要在所有组件上创建此方法。我正在寻找一种动态执行此操作的常规方法。 PS:我的项目中的所有输入都与上面的输入具有相同的规则。

完成此操作的最佳方法是什么?我希望我的问题很清楚。

+2

了解指令,它是操纵dom元素的强大方法。因此,您将基本上获得dom元素并执行任何您想要执行的操作。 (https://angular.io/docs/ts/latest/guide/attribute-directives.html) – pritesh

回答

3

写指令来处理这个问题,像这样:

你的元素
@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')"> 

像这样的事情应该工作,当然是有进口。

+0

请删除返回类型注释,'any'在这里是绝对错误的。此外,这没有任何意义,因为你没有对结果做任何事情。 –

+0

@AluanHaddad我无意中保存了答案的错误副本,更新后的答案已到位。 – chrispy

+0

你正在使用'any'的返回类型,你在返回什么? (如果你让它做它的工作,提示编译器知道最好) –