angularangular2-template

Set null as empty string value for input field


I have an input field mapped to an entity in my controller with a ngModel 2-way binding:

<input type="text" [(ngModel)]="entity.one_attribute" />

When I initialize my controller, I have this entity:

{ one_attribute: null }

If a user starts to fill in the field but does not submit the form immediately and empties the field, my entity is updated to become:

{ one_attribute: "" }

Is it possible to define that empty string should be changed to null automatically?


Solution

  • After viewing a bunch of answers about ValueAccessor and HostListener solutions, I made a working solution (tested with RC1):

    import {NgControl} from "@angular/common";
    import {Directive, ElementRef, HostListener} from "@angular/core";
    
    @Directive({
      selector: 'input[nullValue]'
    })
    export class NullDefaultValueDirective {
      constructor(private el: ElementRef, private control: NgControl) {}
    
      @HostListener('input', ['$event.target'])
      onEvent(target: HTMLInputElement){
        this.control.viewToModelUpdate((target.value === '') ? null : target.value);
      }
    }
    

    Then use it that way on your input fields:

    <input [(ngModel)]="bindedValue" nullValue/>