Я хочу изменить (принудительно) значения поля ввода при вводе с помощью атрибута Directive. С его помощью я хотел бы создать такие директивы, как прописные, строчные, 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
в качестве провайдера). Я получаю
undefined 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)
}
}
Как я уже сказал, я не уверен, что это тоже хороший способ сделать это, поэтому комментарии приветствуются.