我想在使用属性指令键入时更改(强制)输入字段值。有了它,我想创建大写、小写、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 属性指令呢?
- 编辑 -
经过进一步调查,我设法得到了我想要的东西。Günter 提供的答案更接近我的初衷,也许更好。但这里有另一种方式:
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)
}
}
正如我所说,我不确定这是否也是这样做的好方法,因此欢迎发表评论。