Установленное значение ngbDatepicker

В моем приложении Angular, управляемой шаблоном формы, у меня есть поле даты рождения и я добавил ngbDatepicker для этого поля.

<input #dob="ngbDatepicker"
                 (click)="dob.toggle()"
                 [(ngModel)]="model.dob"
                 [ngClass]="{ 'is-invalid': f.submitted &&  dob.invalid }"
                 class="form-control"
                 id="dob"
                 name="dob"
                 required
                 type="text"
                 [disabled]="isDisabled"
                 [class.ash]="isDisabled"
                 [class.highlight]="!isDisabled"
                 ngbDatepicker
          />

Я получаю бэкэнд API для даты рождения dob: "2019-02-16 00:00:00" и я хочу передать это значение, как показано ниже,

 { 
  "year": 2019, 
  "month": 2, 
  "day": 26 
 }

потому что ngbDatepicker получить значение в этом формате. Это то, что я пытался преобразовать мою дату рождения.

toDate(dob) {
 const [year, month, day] = dob.split('-');
 const obj = { year: year, month: month, day: day.split(' ')[0].trim() };
 console.log('convert date', obj);
 this.model.dob = obj;
 //  this.model.dob ={year: 2017, month: 5, day: 13};
}

Выход {year: "2019", month: "02", day: "16"} Я хочу удалить кавычки из этого вывода. Я перепробовал так много методов и не смог получить нужный результат. Я мог бы получить {"year": 2019, "month": 02, "day": 16} этот вывод, используя ниже код.

JSON.stringify({ "year": "2019", "month": "2", "day": "26" }, (key, value) => !isNaN(+value) ? +value : value);

Но чтобы установить дату мне нужно установить объект, как это. {year: 2019, month: 2, day: 26 }

7 ответов

Решение

Я мог бы решить мою проблему, используя parseInt. Используйте эту ссылку, чтобы узнать больше о parseInt. Я изменил свой код, как указано ниже.

toDate(dob) {
if (dob) {
  const [year, month, day] = dob.split('-');
  const obj = { year: parseInt(year), month: parseInt(month), day: 
    parseInt(day.split(' ')[0].trim()) };
  this.model.dob = obj;
  }
}

Этим я решил свою проблему.

Создать экземпляр NgbDate до,

date = new NgbDate(2020,19,02);

сделайте эту дату как ngModel;

Я пытаюсь установить значение с форматом {year: 2020, month: 10, day: 30 }это работает для меня. Обратите внимание на значение дня, если день не существует в этом месяце, значение не будет отображаться в средстве выбора NgbDateAdapter. Я следую решению отсюда

Для тех, кто ищет полную реализацию для этого (с передачей минимальной даты, максимальной даты и установки значения для средства выбора даты):

NgbDatePicker URL: https://ng-bootstrap.github.io/#/components/datepicker/overview

В вашем контроллере компонентов datepicker.component.ts файл добавьте следующее:

      import { NgbDate } from "@ng-bootstrap/ng-bootstrap";
import { NgbDateHelper } from 'src/app/helpers/ngb-date-helper';

Добавить в раздел конструктора

      constructor(
    private ngbDateHelper: NgbDateHelper
) { }

в datepicker.component.html просмотреть файл добавить

      <input
  class="form-control"
  placeholder="yyyy-mm-dd"
  formControlName="dateFieldName"
  ngbDatepicker
  #date="ngbDatepicker"
  [minDate]="minDate"
  [maxDate]="maxDate"
  [(ngModel)]="value"
/>

Чтобы получить minDate, maxDate, value - напишем помощник

Создать файл src/app/helpers/ngb-date-helper.ts

Добавьте следующее содержимое:

      import { Injectable } from '@angular/core';
import { NgbDate } from "@ng-bootstrap/ng-bootstrap";

@Injectable()
export class NgbDateHelper {
  // helper to find out today's year, month, day
  private currentDate() {
    var todayDate = new Date();

    return {
      year: todayDate.getFullYear(),
      month: todayDate.getMonth() + 1,
      day: todayDate.getDate()
    }
  }

  // helper to find out date value, min and max date
  dateMetaData() {
    var minDate = this.currentDate()
    var maxDate = this.currentDate()
    maxDate.year = maxDate.year + 1
    
    var value = new NgbDate(this.currentDate().year,
                            this.currentDate().month + 2,
                            this.currentDate().day)

    return {
      value: value,
      minDate: minDate,
      maxDate: maxDate
    }
  }
}

назовите даты так:

      value: this.ngbDateHelper.dateMetaData().value,
minDate: this.ngbDateHelper.dateMetaData().minDate,
maxDate: this.ngbDateHelper.dateMetaData().maxDate

В этом примере календарь показывает даты от сегодняшней даты до даты 1 года. Предварительно заполненное значение составляет 2 месяца с сегодняшней даты. Вы можете изменить это по своему усмотрению.

Вы можете получить входные данные NgbDatePicker для чтения / записи дат Javascript из / в [(ngModel)]="model.dob" в Angular 9, добавив следующий оператор импорта:

import { NgbDate, NgbDateStruct, NgbDateAdapter, NgbDateNativeAdapter } from '@ng-bootstrap/ng-bootstrap';

и объявление поставщика NgbDateAdapter в вашем операторе @Component:

providers: [
    { provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }]
<ngb-datepicker #d [startDate]="{year: 1789, month: 7}"></ngb-datepicker>

Вы можете написать так

[startDate]="{год: из API dob.getYear(), месяц: из API dob.getMonth()}"

Этот способ работал для меня:

в тс файле:

const date: NgbDateStruct = { year: 1789, month: 7, day: 14 };

в хтмл:

<input type="text" ngbDatepicker [(ngModel)]="date"/>

Другие вопросы по тегам