如何更改角度动力bootstrap ngbDatepicker的模型结构

时间:2017-12-21 06:37:29

标签: angular datepicker ng-bootstrap

我正在使用angular powered bootstrap ngbDatepicker。我创建了自己的自定义控件,它将在不同的页面中用于日期捕获,如下所示。

<form-date 
  [label]="'Date of birth'" 
  [name]="'inputCPDDOB'"
  [(ngModel)]="birthDate"
  placeholder="mm/dd/yyyy"
  required
  >
</form-date>

这里我已经将birthDate作为我的模型对象。

我想要

  1. 用户应该可以通过单击CAL按钮(文本框旁边)
  2. 来选择日期
  3. 用户应该能够以“MM / DD / YYYY&#39; MM / DD / YYYY&#39;在文本框中。
  4. 选择或输入日期后,模型应更新为字符串格式&#39; YYYY-MM-DD&#39;通过双向数据绑定。
  5. 通过继承NgbDateParserFormatter

    ,我成功地将第1点和第2点作为MM / DD / YYYY的文本框的日期格式

    但我无法改变模型结构。虽然我需要与我的网络服务沟通,因为&#39; YYYY-MM-DD&#39;格式。

    请帮我实现同样的目标。这是附加的plunker

1 个答案:

答案 0 :(得分:11)

所以我认为解决问题的最简单方法是提供自己的NgbDateAdapter实现并将其注入到组件中。您需要添加

{provide: NgbDateAdapter, useClass: NgbUTCStringAdapter}

到组件提供程序数组并在某处定义NgbUTCStringAdapter:

@Injectable()
export class NgbUTCStringAdapter extends NgbDateAdapter<string> {

  fromModel(date: string): NgbDateStruct {
    return (date && Number(date.substring(0, 4)) && Number(date.substring(5, 7) + 1) && Number(date.substring(8, 10))) ?
                {year: Number(date.substring(0, 4)),
                    month: Number(date.substring(5, 7)),
                    day: Number(date.substring(8, 10))} : null;
  }

  toModel(date: NgbDateStruct): string {
    return date ? date.year.toString() + '-' + String('00' + date.month).slice(-2)
                            + '-' + String('00' + date.day).slice(-2) : null;
  }
}

另一种方法是将此代码放入您的自定义表单控件中:

@Component({
selector: 'app-date',
templateUrl: './date.component.html',
providers: [
    {
        provide: NG_VALUE_ACCESSOR,
        useExisting: forwardRef(() => DateComponent),
        multi: true
    },
    {provide: NgbDateParserFormatter, useClass: NgbDateOmniParserFormatter}]
})

export class DateComponent implements ControlValueAccessor {

  model;

  writeValue(value: any) {
    this.model =  (value && Number(value.substring(0, 4)) && 
                        Number(value.substring(5, 7) + 1) &&
                        Number(value.substring(8, 10))) ?
                            {year: Number(value.substring(0, 4)),
                             month: Number(value.substring(5, 7)),
                             day: Number(value.substring(8, 10))} : null;
  }

  propagateChange = (_: any) => {};

  registerOnChange(fn) {
    this.propagateChange = fn;
  }

  registerOnTouched() {}

  change() {
    const date = this.model ? this.model.year.toString() + '-' + 
                   String('00' + this.model.month).slice(-2) + '-' +
                   String('00' + this.model.day).slice(-2) : null;

    this.propagateChange(date);
  }
}