Angular 2 - 输入掩码:输入框显示格式化值,而模型保留未格式化的值

时间:2016-06-08 19:14:56

标签: angular angular2-directives angular2-forms

我尝试在键入时输入字段格式/掩码值,同时让实际模型保留原始(或格式不同)的值。我正在考虑电话号码等,但为了简单起见,我使用大写字母进行测试。

我尝试了很多东西,希望它像指令一样简单。但似乎无法使显示值偏离表单值。

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>

2 个答案:

答案 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中试过它并且它有效。

编辑: 哈哈可能需要为不同的场景做一些工作