Angular 2属性指令用于修改输入主机的文本和值

时间:2016-10-13 22:57:16

标签: angular angular2-directives

我需要一个属性指令,将输入格式化为dd-mm-yyyy并将其作为文本值并根据javascript日期作为值。在rc.3,我使用了ngFormControl.valueAccessor.writeValue()和其他一些方法。现在看来NgFormControl在发布版本中消失了。我现在该怎么用?以下是我以前做的事情:

<input type="text" format-date2 [ngFormControl]='formControls.dateOfMarriage'>

import {Directive, ElementRef} from '@angular/core';
import {NgFormControl} from '@angular/common';

@Directive({
selector: '[format-date2]',
host: {
  '(input)': 'onInputChange()',
  'placeholder': 'dd-mm-yyyy',
 },
})
export class FormatDate2 {

viewValue;
modelValue;
currentValue = '';
el: HTMLInputElement;

constructor(private model: NgFormControl, private elementRef: ElementRef) {
  this.el = elementRef.nativeElement;
}

ngOnInit() {
 if (this.model.control.value) {
  let d = new Date(this.model.control.value);
  let s = this.pad(d.getDate()) + '-' + this.pad(d.getMonth() + 1) + '-' + d.getFullYear();
  this.model.valueAccessor.writeValue(s);
  }
}

pad(n) {
  return n < 10 ? '0' + n : n;
}

onInputChange() {
  let i = this.el.selectionEnd - this.el.value.length;
  this.format(this.el.value);
  i = this.viewValue.length + i;
  this.model.control.updateValue(this.modelValue);
  this.model.valueAccessor.writeValue(this.viewValue);
  this.el.setSelectionRange(i, i);
  return false;
}

format(val) {
// some code
//   this.modelValue = 'some value';
//   this.viewValue = 'another value' 
}

}

1 个答案:

答案 0 :(得分:2)

  • 而不是NgFormControl班级使用NgControl / @angular/forms
  • 使用[ngFormControl]
  • 代替[formControl]指令

您还需要确保@NgModule.imports: [ ReactiveFormsModule ]进入使用表单的组件的任何模块。这是用于使用被动表单,即FormControl / FormGroup,但模板表单,只需使用FormsModule。你的例子虽然看起来像是在使用反应形式。但是你的指令也适用于模板表格。