【问题标题】:Angular2 - Changing classes dynamicallyAngular2 - 动态更改类
【发布时间】:2017-07-21 15:44:03
【问题描述】:

我的组件中的表单中重复出现以下代码:

<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:我项目中的所有输入都与上面的输入具有相同的规则。

实现此目的的最佳方法是什么?我希望我的问题足够清楚。

【问题讨论】:

标签: angular angular2-directives


【解决方案1】:

编写一个指令来处理这个问题,如下所示:

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

这样的东西应该可以工作,当然还有导入。

【讨论】:

  • 请去掉返回类型注解,any 在这里是绝对错误的。此外,这没有任何意义,因为您没有对结果做任何事情。
  • @AluanHaddad 我不小心保存了错误的答案副本,更新的答案已经到位。
  • 您使用的返回类型为any,您返回的是什么? (提示编译器最好让其完成工作)
  • 哦!对不起,我从他的问题中复制了这个。这不需要返回类型。
  • 是的,通常最好让它在其他情况下也推断类型。它总是比使用any 更好。因此,无论哪种情况,您都可以在更新的答案中省略返回类型,顺便说一下,void
猜你喜欢
  • 2018-09-12
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2016-01-24
  • 2014-11-15
相关资源
最近更新 更多