【问题标题】:Add validation class to parent element in angular 6 template driven form以 Angular 6 模板驱动形式向父元素添加验证类
【发布时间】:2019-05-24 15:40:57
【问题描述】:

概述:

我正在尝试找到一种将类添加到输入父元素的好方法

我目前有这个代码:

<p [ngClass]="{'error' : prop.invalid && (prop.dirty || prop.touched) }"> <label>Prop Label</label> <input type="text" [(ngModel)]="model.prop" #prop="ngModel" required /> </p>

效果很好!

问题:

我希望能够以更通用的方式来做到这一点,即

  • 使用指令设置父类(似乎找不到如何将 prop.invalid 传递给它?)
  • 将父元素设置为在全局级别接收类而不是输入

注意:我没有使用响应式表单

【问题讨论】:

    标签: angular validation angular2-directives


    【解决方案1】:

    您可以向 &lt;p&gt; 元素添加自定义属性指令,以检查其子 &lt;input&gt; 有效性。

    关于你在问题中提到的问题:

    • using a directive to set the parent class:使用Renderer2 类将error 类添加/删除到&lt;p&gt; 元素

    • (can't seem to find how to pass prop.invalid to it?):您将通过使用@ContentChild 获得对&lt;input&gt; 的引用,并通过NgModel 类找到它。

    • setting the parent element to receive the classes at a global level instead of the input: 不知道是什么问题,好像是第一个。如果需要,请对此答案添加评论。


    Live Stackblitz DEMO

    这些是您需要进行的更改:

    HTML:

    <p requiredValidator>
        <label>Prop Label</label>
      <br>
      <input type="text" [(ngModel)]="model.prop" #prop="ngModel" required />
    </p>
    

    指令:

    import { Directive, ElementRef, Renderer2, ViewChild, ContentChild, AfterContentInit } from '@angular/core';
    import { NgModel } from '@angular/forms';
    
    @Directive({
      selector: '[requiredValidator]'
    })
    export class RequiredValidatorDirective implements AfterContentInit {
      element: ElementRef;
      renderer: Renderer2;
      @ContentChild(NgModel) input: NgModel;
    
      constructor(element: ElementRef, renderer: Renderer2) {
        this.element = element;
        this.renderer = renderer;
      }
    
      ngAfterContentInit() {
        this.input.valueChanges.subscribe(() => {
          if (this.input.invalid  && (this.input.dirty || this.input.touched)) {
            this.addErrorClass();
          } else {
            this.removeErrorClass();
          }
        })
      }
    
      addErrorClass(): void {
        this.renderer.addClass(this.element.nativeElement, 'error');
      }
    
      removeErrorClass(): void {
        this.renderer.removeClass(this.element.nativeElement, 'error');
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 2018-12-23
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2019-10-01
      • 1970-01-01
      相关资源
      最近更新 更多