#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, вы можете спросить там или здесь…