属性ディレクティブを使用して入力中に入力フィールドの値を変更 (強制) したい。それを使用して、フォームの入力フィールドで使用される大文字、小文字、maxlength、filterchar などのディレクティブを作成したいと思います。この例を見つけました: Angular 2 Attribute Directive Typescript Exampleですが、これはうまくいかないようです。Angular2 の以前のビルドではそうなったのかもしれません。しかし、それはまさに私がやりたいことです。
次のようなディレクティブを作成すると:
import {Directive} from 'angular2/core';
import {NgModel} from 'angular2/common';
@Directive({
selector: '[ngModel][uppercase]',
host: {
'(input)' : 'onInputChange()'
}
})
export class UppercaseDirective{
constructor(public model:NgModel){}
onInputChange(){
var newValue = this.model.value.toUpperCase();
this.model.valueAccessor.writeValue(newValue);
this.model.viewToModelUpdate(newValue);
}
}
そして、次のようなフォームで使用します。
<input type="text" class="form-control" [(ngModel)]="field.name" ngControl="name" #name="ngForm" required uppercase>
(そしてNgModel
プロバイダーとして登録します)。私は得る
未定義の this.model.value。
私は$event.target.value = $event.target.value.toUpperCase()
( で渡すときに$event
)使用できonInputChange()
、それはビューで機能します(入力は大文字で表示されますが、バインドフィールド「field.name」は更新されません。
では、これを行う Angular2 属性ディレクティブを作成するにはどうすればよいでしょうか?
- 編集 -
さらなる調査の後、私はなんとか欲しいものを手に入れることができました。ギュンターが提供した答えは、私の当初の意図に近く、おそらくより良いものです。しかし、ここに別の方法があります:
import {Directive, Input, Output, EventEmitter} from 'angular2/core';
@Directive({
selector: '[ngModel][uppercase]',
host: {
"(input)": 'onInputChange($event)'
}
})
export class UppercaseDirective{
@Output() ngModelChange:EventEmitter<any> = new EventEmitter()
value: any
onInputChange($event){
this.value = $event.target.value.toUpperCase()
this.ngModelChange.emit(this.value)
}
}
私が言ったように、これがこれを行う良い方法であるかどうかはわかりませんので、コメントを歓迎します.