How to convert input value to uppercase in angular 2 (value passing to ngControl)

后端 未结 10 726
不知归路
不知归路 2020-11-28 10:31

I am trying to validate the input fields using ngControl\'s value in angular 2. i need to validate that the user enters the value in upper case always.

Now we need

10条回答
  •  广开言路
    2020-11-28 10:57

    At least in my experience, I found two of the answers here insightful, but not working on their own: from Thierry Templier (with first comment as well), and from cal.

    I put together parts of both, and came up with this version, which is now working with Angular 4.1.1 in a reactive form:

    import { Directive, Renderer, ElementRef, forwardRef } from '@angular/core';
    import { NG_VALUE_ACCESSOR, DefaultValueAccessor } from '@angular/forms';
    
    const LOWERCASE_INPUT_CONTROL_VALUE_ACCESSOR = {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => LowerCaseInputDirective),
      multi: true,
    };
    
    @Directive({
      selector: 'input[lowercase]',
      host: {
        // When the user updates the input
        '(input)': 'onInput($event.target.value)',
        '(blur)': 'onTouched()',
      },
      providers: [
        LOWERCASE_INPUT_CONTROL_VALUE_ACCESSOR,
      ],
    })
    export class LowerCaseInputDirective extends DefaultValueAccessor {
    
      constructor(renderer: Renderer, elementRef: ElementRef) {
        super(renderer, elementRef, false);
      }
    
      writeValue(value: any): void {
        const transformed = this.transformValue(value);
    
        super.writeValue(transformed);
      }
    
      onInput(value: any): void {
        const transformed = this.transformValue(value);
    
        super.writeValue(transformed);
        this.onChange(transformed);
      }
    
      private transformValue(value: any): any {
        const result = value && typeof value === 'string'
          ? value.toLowerCase()
          : value;
    
        return result;
      }
    }
    

    This is for lower-case, but everything holds for upper-case as well, just rename directive, replace within selector and transformValue.

    Edit:
    A straightforward usage example from HTML code using such directive:

    
    

提交回复
热议问题