2016-06-08 31 views
5

Sto provando ad avere un formato di campo di input/valori maschera man mano che vengono digitati, mentre il modello attuale mantiene il raw (o formattato in modo diverso) valore. Sto pensando ai numeri di telefono ecc., Ma per semplicità sto usando le lettere maiuscole per i test.Angolare 2 - Maschera di input: la casella di input visualizza il valore formattato, mentre il modello mantiene il valore non formattato

Ho provato un sacco di cose, sperando che sia semplice come una direttiva. Ma non sembra che il valore visualizzato diventi distante dal valore del modulo.

Plunk: http://plnkr.co/edit/VH5zn4S8q28CBpFutBlx?p=preview

Ecco la direttiva:

@Directive({ 
    selector: '[uppercase]', 
    host: { 
    '(input)': 'onInputChange()', 
    } 
}) 

export class UppercaseDirective { 

    constructor(private model: NgFormControl) { } 

    onInputChange() { 
    let newValue = this.model.value.toUpperCase(); 
    this.model.viewToModelUpdate(newValue); 
    this.model.valueAccessor.writeValue(newValue); 
    } 

} 

e la forma:

<form [ngFormModel]='myForm'> 
    <input [ngFormControl]='myForm.controls.field' uppercase> 
    <div> 
    {{ myForm.value.field }} 
    </div> 
</form> 
+0

perché no Pipes? Sembra che tu voglia solo un modo diverso di visualizzare il testo. –

+0

Voglio che la formattazione avvenga nella casella di input - una maschera di input. Sto solo visualizzando il valore nella vista a scopo di test. – Steve

risposta

3

tenta di aggiornare riferimento di controllo direttamente in questo modo:

onInputChange() { 
    let newValue = this.model.value.toUpperCase(); 
    this.model.control.updateValue(newValue); 
} 

Vedi anche plunker http://plnkr.co/edit/XYPWYgA8lbg2EdxPqzWj?p=preview

+0

Ha senso. Grazie. Stavo cercando di avere il valore del modello e il valore di visualizzazione diversi, ma la tua risposta mi ha dato la risposta: http://plnkr.co/edit/VH5zn4S8q28CBpFutBlx?p=preview – Steve

1

Per essere onesti, io sto ancora imparando angular2 e la tecnologia è ancora molto immaturo per dire che questo è il modo migliore per farlo, ma dopo aver giocato con esso:

import {Directive, ElementRef, Output, EventEmitter} from '@angular/core'; 
import {NgFormControl} from '@angular/common'; 

@Directive({ 
    selector: '[uppercase]', 
    host: { 
    '(input)': 'onInputChange()', 
    } 
}) 

export class UppercaseDirective { 

    @Output() onChange = new EventEmitter(); 
    rawValue: string = ''; 

    constructor(private model: NgFormControl, private elementRef: ElementRef) { } 

    onInputChange() { 
    let str = this.model.value; 
    this.rawValue = this.rawValue.substring(0, str.length) + str.substring(this.rawValue.length, str.length); 
    let newValue = this.rawValue.toUpperCase(); 
    this.model.viewToModelUpdate(newValue); 
    this.model.valueAccessor.writeValue(newValue); 
    this.onChange.emit(this.rawValue); 
    } 

} 

allora si può ottenere in questo modo:

<input [ngFormControl]='myForm.controls.field' uppercase (onChange)="raw = $event"> 
<div> 
    {{ raw }} 
</div> 

Dal momento che ogni volta che si aggiorna il modello, la variabile cambierà. Devi fare è separato. Provato nel tuo plnkr e ha funzionato.

EDIT: potrebbe essere necessario un po 'di lavoro per diversi scenari però haha ​​

+0

Grazie Ed. Quello che sto cercando di ottenere, però, è che il modello di modulo contenga il valore grezzo. – Steve

+0

@Steve Questo potrebbe interessarti http://stackoverflow.com/questions/37800841/input-mask-fields-in-angular2-forms –