2016-06-08 15 views
5

Ich versuche, ein Eingabefeld Format/Maske Werte wie sie eingegeben werden, während das tatsächliche Modell behalten die Raw (oder anders formatiert) Wert. Ich denke Telefonnummern usw., aber aus Gründen der Einfachheit verwende Großbuchstaben zum Testen.Angular 2 - Eingabemaske: Eingabefeld Anzeige formatiert Wert, während Modell unformatierten Wert

Ich habe eine Menge Zeug ausprobiert, in der Hoffnung, es ist so einfach wie eine Richtlinie. Es scheint aber nicht so zu sein, dass der Anzeigewert vom Formwert abweicht.

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

Hier ist die Richtlinie:

@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); 
    } 

} 

und die Form:

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

warum nicht Pipes? Klingt so, als ob Sie nur eine andere Art der Anzeige des Textes wünschen. –

+0

Ich möchte die Formatierung in der Eingabebox passieren - eine Eingabemaske. Ich zeige den Wert nur zu Testzwecken in der Ansicht an. – Steve

Antwort

3

versuchen, die Kontrolle Referenz wie diese direkt zu aktualisieren:

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

See Plunker auch http://plnkr.co/edit/XYPWYgA8lbg2EdxPqzWj?p=preview

+0

Macht Sinn. Vielen Dank. Ich habe versucht, den Modellwert und den Anzeigewert unterschiedlich zu gestalten, aber Ihre Antwort gab mir die Antwort: http://plnkr.co/edit/VH5zn4S8q28CBpFutBlx?p=preview – Steve

1

Um ehrlich zu sein, ich lerne immer noch angular2 und die Tech ist immer noch sehr unreif Sagen Sie, dies ist der beste Weg, es zu tun, aber nachdem Sie damit herumgespielt haben:

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); 
    } 

} 

dann können Sie es wie folgt erhalten:

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

Seit wann immer Sie das Modell aktualisieren, wird die Variable ändern. Sie müssen sich trennen. Versucht es in Ihrem PLNKR und es hat funktioniert.

EDIT: könnten einige Arbeit für verschiedene Szenarien müssen allerdings haha ​​

+0

Danke Ed. Was ich jedoch erreichen möchte, ist, dass das Formularmodell den Rohwert enthält. – Steve

+0

@Steve Das könnte Sie interessieren http://stackoverflow.com/questions/37800841/input-mask-fields-in-angular2-forms –