2016-11-18 3 views
6

Ich habe eine einfache Angular 2-Direktive, die den Eingabewert eines Textfelds ändert. Beachten Sie, dass ich den modellgesteuerten Formularansatz verwende.Angular 2 Input Directive Ändern des Formularsteuerwerts

@Directive({ 
    selector: '[appUpperCase]' 
}) 
export class UpperCaseDirective{ 

    constructor(private el: ElementRef, private control : NgControl) { 

    } 

    @HostListener('input',['$event']) onEvent($event){ 
    console.log($event); 
    let upper = this.el.nativeElement.value.toUpperCase(); 
    this.control.valueAccessor.writeValue(upper); 

    } 

} 

Das dom wird ordnungsgemäß aktualisiert, das Modell wird jedoch nach jedem weiteren Tastendruck aktualisiert. Werfen Sie einen Blick auf die plnkr

Antwort

13

Das begeistert mich, weil ich das früher angetroffen und war kratzen mir am Kopf.

das Problem Neubetrachtung, was Sie tun müssen, ist Ihre this.control.valueAccessor.writeValue(upper) zu ändern, in dem die ControlValueAccessor ausdrücklich auf das DOM-Element zu schreiben und nicht an der Steuerung selbst statt

this.control.control.setValue(upper); 

zu nennen, die auf den Wert ändern das Steuerelement und wird sowohl auf der Seite als auch in der Eigenschaft des Steuerelements korrekt wiedergegeben. https://angular.io/docs/ts/latest/api/forms/index/ControlValueAccessor-interface.html

A ControlValueAccessor abstrahiert die Operationen einen neuen Wertes mit einem DOM-Elemente Schreiben eine Eingabesteuerung darstellt.

Hier ist ein gegabelt Plunker: http://plnkr.co/edit/rllNyE07uPhUA6UfiLkU?p=preview

+0

Awesome! Danke für die Erklärung. –

+0

Wie steht es mit der Zeichenposition? Die Tastenkombination sendet die Zeichenposition an das Ende der Eingabe. – Skyler

+0

@silntsod Haben Sie eine Idee, wie Sie es mit Template-gesteuerten Formular verwenden? mit ngModel – Vishal

0

Ich war für so etwas suchen, aber wenn ich den Code in meinem Projekt wurde versucht, ich Fehler auf der Linie this.el.nativeElement.value.toUpperCase bekommen () gemäß dem obigen Arbeitsbeispiel von @silentsod.

geändert ich den Code zu:

let str:string = this.control.value; 
this.control.control.setValue(str.toUpperCase()); 

hier ein gegabelt Plunker: http://plnkr.co/edit/uf6udp7mQYmnKX6hGPpR?p=preview

Verwandte Themen