【问题标题】:How to trigger an event when the month changes on ngx-bootstrap datepicker?ngx-bootstrap datepicker上的月份更改时如何触发事件?
【发布时间】:2020-10-30 12:15:37
【问题描述】:
【问题讨论】:
标签:
angular
events
datepicker
ngx-bootstrap
【解决方案1】:
可以使用日期选择器内部存储。是的,我知道这是私人的。因此也许不是最干净的解决方案。但由于似乎没有公共 API,我别无选择。我真的需要知道用户何时在日历上看到不同的月份,以便有效地加载该月的可用日期。
这里是订阅 datepicker 的 store 并在 datepicker 的视图发生变化时收到通知的代码。当月份更改时,您将收到通知日期。
import { BsDatepickerInlineDirective } from 'ngx-bootstrap/datepicker';
import { BehaviorSubject } from 'rxjs';
interface BsDatePickerStoreView {
date: Date,
mode: keyof { 'day', 'month', 'year'}
}
interface BsDatePickerStoreData {
view:BsDatePickerStoreView
}
export class BsDatePickerUtils
{
public viewChanged = new BehaviorSubject<Date>(undefined);
private lastKnownViewDate: Date = undefined;
constructor(datePicker: BsDatepickerInlineDirective) {
const store = (datePicker as any)._datepicker.instance._store.source as BehaviorSubject<BsDatePickerStoreData>;
store.subscribe((data) => {
const viewMode = data.view.mode;
const date = data.view.date as Date;
if (!this.lastKnownViewDate || this.lastKnownViewDate.toDateString() !== date.toDateString()) {
if (data.view.mode === 'day') {
this.lastKnownViewDate = date;
this.viewChanged.next(data.view.date);
}
}
});
}
}
这是一个简单的用法示例
// Usage example
@Component({
selector: 'my-component',
template: `
<div>
<bs-datepicker-inline #datePicker></<bs-datepicker-inline>
</div>
`
})
export class MyComponent implements OnInit, AfterViewInit {
@ViewChild(BsDatepickerInlineDirective) datePicker: BsDatepickerInlineDirective;
bsDatePickerUtils: BsDatePickerUtils;
ngAfterViewInit() {
this.bsDatePickerUtils = new BsDatePickerUtils(this.datePicker);
this.bsDatePickerUtils.viewChanged.subscribe(date => {
console.log('Calendar changed: ' + date);
});
}
}