【发布时间】:2016-07-06 12:06:33
【问题描述】:
我想在使用属性指令键入时更改(强制)输入字段值。有了它,我想创建大写、小写、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)
}
}
正如我所说,我不确定这是否也是一个好方法,所以欢迎 cmets。
【问题讨论】:
标签: angular directive angular2-ngmodel