2016-11-18 9 views
6

私は、テキストボックスの入力値を変更する単純なAngular 2指令を持っています。私はModel-Driven形式のアプローチを使用しています。角2の入力指令フォームの制御値を変更する

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

    } 

} 

DOMは正しく更新されますが、モデルは他のキーストロークごとに更新されます。 plnkr

答えて

13

これは私が以前これに遭遇し、私の頭を傷つけていたので、これは私を興奮させる。あなたが何をする必要があるか、問題を再考

はControlValueAccessorが明示的に代わりに値を変更します

this.control.control.setValue(upper); 

を呼び出すためにDOM要素にではなく、コントロール自体に書き込んでいるあなたthis.control.valueAccessor.writeValue(upper)を変更することですコントロールとページとコントロールのプロパティの両方に正しく反映されます。 https://angular.io/docs/ts/latest/api/forms/index/ControlValueAccessor-interface.html

A ControlValueAccessorは、入力された制御を表すDOM要素に新しい値 の書き込み動作を抽象化します。

ここフォークplunkerです:(私はこのような何かを探していたが、私は私のプロジェクトにコードをしようとしたとき、私はラインthis.el.nativeElement.value.toUpperCase上のエラーを得ていたhttp://plnkr.co/edit/rllNyE07uPhUA6UfiLkU?p=preview

+0

恐ろしい:

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

ここフォークplunkerです!説明ありがとう。 –

+0

文字の位置はどうですか?キー入力は文字位置を入力の最後に送ります。 – Skyler

+0

@silntsodテンプレートドリブンフォームでどのように使用するのですか? ngModelで – Vishal

関連する問題