14

我正在尝试构建一个日期时间选择器指令,如下所示。
<input [(ngModel)]="date1" datetime-picker date-only />

并被date1分配为日期,例如,new Date()

当我在 html 中显示它时,输入元素中的文本如下所示
Thu Jan 01 2015 00:00:00 GMT-0500

我想改为显示如下
2015-01-01 00:00:00

我想使用 DatePipe 在指令中格式化日期,而不是显示默认 toString() 函数的结果。

我的问题是;“在指令中,我如何访问 ngModel 变量?”,例如 date1,以便我可以添加 toString() 方法。

如果我的方法不对,请指教。

4

3 回答 3

18

这是收听和通知 ngModel 的简单方法。为了便于理解,我刚刚演示了 jQuery。实际上,它可以是任何东西。

import { Directive, ElementRef } from '@angular/core';
import { NgModel } from '@angular/forms';

@Directive({
    selector: `[ngModel][customDir]`,
    providers: [NgModel]
})
export class CustomDirective {


    constructor(private element: ElementRef, private ngModel: NgModel) {

    }

    ngOnInit() {
        let that = this;
        /* Here you can write custom initialization code */

        /* Listening to the value of ngModel */
        that.ngModel.valueChanges.subscribe(function (value) {
            /* Set any value of your custom control */
            $(that.element.nativeElement).data("newValue",value);
        });

        /* Inform ng model for any new change happened */
        $(that.element.nativeElement).bind("customEvent",function (someNewValue) {
                that.ngModel.update.emit(someNewValue);
            }
        });
    }
}
于 2016-10-21T14:59:14.983 回答
14

对于访问ngModel,您只需@Input()datetime-picker. 而且由于您使用的是 2 路数据绑定,因此您必须发出对ngModel.

@Directive({
  selector:'[date-time-picker]'
})
export class DateTimePicker{
  @Input() ngModel;
  @Output() ngModelChange = new EventEmitter();

  ngOnInit(){
    this.ngModelChange.emit(this.ngModel.toDateString());
  }
}

检查这个笨蛋


恕我直言,更好的方法是使用DatePipe

@Component({
  selector: 'my-app',
  directives:[DateTimePicker],
  template: `
      <input (ngModelChange)="myDate = $event" [ngModel]="myDate | date:'short'" datetime-picker  />
  `
})
export class AppComponent {
  myDate = new Date();
}

检查这个笨蛋

于 2016-05-23T03:05:56.463 回答
3

您可以使用“keyup”和“this.ngModel.model”

import { Directive, HostListener } from '@angular/core';
import { NgModel } from '@angular/forms';

@Directive({
  selector: '[ngModel][customDir]',
  providers: [NgModel]
})
export class CustomDirective {

  constructor(private ngModel: NgModel) { }

  @HostListener('keyup', ['$event']) onKeyUp(event) {
    let value = this.ngModel.model;
    this.ngModel.update.emit(value);
  }
}
于 2019-01-12T12:24:53.837 回答