我尝试在键入时输入字段格式/掩码值,同时让实际模型保留原始(或格式不同)的值。我正在考虑电话号码等,但为了简单起见,我使用大写字母进行测试。
我尝试了很多东西,希望它像指令一样简单。但似乎无法使显示值偏离表单值。
plunk:http://plnkr.co/edit/VH5zn4S8q28CBpFutBlx?p=preview
这是指令:
@Directive({
selector: '[uppercase]',
host: {
'(input)': 'onInputChange()',
}
})
export class UppercaseDirective {
constructor(private model: NgFormControl) { }
onInputChange() {
let newValue = this.model.value.toUpperCase();
this.model.viewToModelUpdate(newValue);
this.model.valueAccessor.writeValue(newValue);
}
}
和表格:
<form [ngFormModel]='myForm'>
<input [ngFormControl]='myForm.controls.field' uppercase>
<div>
{{ myForm.value.field }}
</div>
</form>
答案 0 :(得分:3)
尝试直接更新控件引用:
onInputChange() {
let newValue = this.model.value.toUpperCase();
this.model.control.updateValue(newValue);
}
另见plunker http://plnkr.co/edit/XYPWYgA8lbg2EdxPqzWj?p=preview
答案 1 :(得分:1)
说实话,我还在学习angular2,而且说这是最好的方法,但是在玩完它之后,技术仍然是不成熟的:
import {Directive, ElementRef, Output, EventEmitter} from '@angular/core';
import {NgFormControl} from '@angular/common';
@Directive({
selector: '[uppercase]',
host: {
'(input)': 'onInputChange()',
}
})
export class UppercaseDirective {
@Output() onChange = new EventEmitter();
rawValue: string = '';
constructor(private model: NgFormControl, private elementRef: ElementRef) { }
onInputChange() {
let str = this.model.value;
this.rawValue = this.rawValue.substring(0, str.length) + str.substring(this.rawValue.length, str.length);
let newValue = this.rawValue.toUpperCase();
this.model.viewToModelUpdate(newValue);
this.model.valueAccessor.writeValue(newValue);
this.onChange.emit(this.rawValue);
}
}
那么你可以这样得到它:
<input [ngFormControl]='myForm.controls.field' uppercase (onChange)="raw = $event">
<div>
{{ raw }}
</div>
每当您更新模型时,变量都会更改。你必须做的是分开的。在你的plnkr中试过它并且它有效。
编辑: 哈哈可能需要为不同的场景做一些工作