Управляемая моделью форма с помощью ng2-bootstrap datepicker

#angular #datepicker #angular2-forms #ng2-bootstrap #angular2-formbuilder

#angular #datepicker #angular2-формы #ng2-bootstrap #angular2-formbuilder

Вопрос:

Я осмотрелся и не смог найти ничего определенного по этому вопросу — можете ли вы использовать ng2-bootstrap datepicker с формой, управляемой моделью Angular2, или она работает только с шаблонными формами?

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

 <datepicker [(ngModel)]="startDate" ></datepicker>
 

… который, похоже, работает. В идеале я хотел бы использовать его следующим образом:

 <datepicker formControlName="startDate" ></datepicker>
 

…но, похоже, это не работает таким образом из коробки. Есть ли способ использовать этот модуль с формами, управляемыми моделью? Если нет, есть ли разумная альтернатива, которая будет работать с формами, управляемыми моделью? (Я также пробовал ng2-datepicker, но есть выдающаяся ошибка, которая делает его неудобным для использования с SystemJS, что вызывает сожаление, потому что выглядит гладко).

Комментарии:

1. Что происходит, когда вы используете первый пример? Вы получаете ошибки? Я никогда не использовал эту библиотеку, но я думаю, что с формами ngModel и template вам нужен name атрибут

2. Это работает нормально, вам не нужен name атрибут. … так что, если бы я использовал формы, управляемые шаблонами, у меня все было бы готово, но я предпочитаю формы, управляемые моделью.

3. Извините, я неправильно понял ваш вопрос. Я прочитал это, когда вы пытались использовать первый пример, а не второй. Упс 😀

4. Можете ли вы показать полный пример компонента и шаблона. Я бы хотел попробовать. Я уверен, что это можно сделать.

5. У Valor software есть полные примеры на их сайте. Ближе всего к моим будут те, которые используют SystemJS и Angular2 Quickstart. Взгляните: valor-software.com/ng2-bootstrap/#/datepicker . Обратите внимание, что я в основном перешел на primeng, поскольку, похоже, он делает то, что я ищу, прямо из коробки.

Ответ №1:

Я создал простую оболочку для ng2-bootstrap datepicker, чтобы использовать ее с ReactiveFormsModule. Он использует moment, поэтому вы можете улучшить его для своих нужд.

Живая демонстрация

пользовательский-datepicker.component.ts

 import { Component, forwardRef, Provider } from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';
import * as moment from 'moment';

let DATEPICKER_VALUE_ACCESSOR: Provider = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => CustomDatepickerComponent),
  multi: true
};

@Component({
  selector: 'custom-datepicker[formControlName]',
  template: `
    <datepicker [(ngModel)]="datePickerValue"></datepicker>
  `,
  providers: [DATEPICKER_VALUE_ACCESSOR]
})
export class CustomDatepickerComponent implements ControlValueAccessor {
  change = (_: any) => {};
  _customDatePickerValue;
  _datePickerValue: Date;

  get customDatePickerValue() {
    return this._customDatepickerValue;
  }
  set customDatePickerValue(value) {
    this._customDatepickerValue = value;
    this.change(value);
  }

  get datePickerValue() {
    return this._datePickerValue;
  }
  set datePickerValue(value) {
    this._datePickerValue = value;
    this.customDatePickerValue = moment(value).format('DD/MM/YYYY');
  }

  writeValue() {}
  registerOnChange(fn) {
    this.change = fn;
  }
  registerOnTouched() {}
}
 

использование в ваших компонентах

app.component.ts

 import { Component } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';

@Component({
  selector: 'my-app',
  template: `
  <form [formGroup]="form">
    <custom-datepicker formControlName="customDatepickerValue"></custom-datepicker>
  </form>

  <pre>{{form.value | json }}</pre>
    `
})
export class AppComponent {
  form: FormGroup = new FormGroup({
    customDatepickerValue: new FormControl()
  })
}
 

Ответ №2:

Я использовал набор элементов управления PrimeNG, и у них есть элемент управления календарем с потрясающей функциональностью. Смотрите это здесь: элемент управления календарем пользовательского интерфейса PrimeNG

Комментарии:

1. Это выглядит в целом великолепно! Спасибо — я попробую. Это будет datepicker # 4 в моих поисках утопии datepicker, но это, безусловно, выглядит многообещающе. Я не уверен, почему до сих пор не появилось более заметного в моем поиске…

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

3. Будет сделано — я выясню это сегодня днем. Пока выглядит хорошо.

4. Работает хорошо, но у меня возникают проблемы с применением любого css к полю ввода. Я попытался использовать styleClass (который встраивает поле ввода во что-то, оформленное так, как я хочу, но не оформляет ввод) и inputStyleClass который, насколько я могу судить, ничего не делает, независимо от того, какой css я связываю с этим классом. Если я попытаюсь встроить ее, например <p-calendar inputStyle="background-color:#F4F9FF;" id="startDate" formControlName="startDate"></p-calendar> , я получу сообщение об ошибке; Cannot find a differ supporting object 'background-color:#F4F9FF;' . Есть идеи, как успешно оформить поле ввода?

5. Извините, я не большой знаток css… Существует форум сообщества, управляемый PrimeNG, вы можете спросить там или здесь…