我正在使用Angular Bootstrap创建日期范围选择器,尽管代码正是他们示例中的内容,但我遇到了一些错误,所有错误都指出“ TypeError:无法读取未定义的属性'equals'。
这是我的代码:https://stackblitz.com/angular/ggxrvppdjeq
唯一真正的区别是我要从另一个文件夹导入NgbDate
:
import { NgbDate } from '@ng-bootstrap/ng-bootstrap/datepicker/ngb-date';
如果像示例一样尝试从@ng-bootstrap/ng-bootstrap
开始这样做,我将在VSCode中得到一个错误:node_modules/@ng-bootstrap/ng-bootstrap"' has no exported member
。将其切换到上面的方法可以使错误消失……但这也许是导致问题的原因?
模板:
<ngb-datepicker #dp (select)="onDateSelection($event)" [displayMonths]="2" [dayTemplate]="t" outsideDays="hidden">
</ngb-datepicker>
<ng-template #t let-date let-focused="focused">
<span class="custom-day"
[class.focused]="focused"
[class.range]="isRange(date)"
[class.faded]="isHovered(date) || isInside(date)"
(mouseenter)="hoveredDate = date"
(mouseleave)="hoveredDate = null">
{{ date.day }}
</span>
</ng-template>
<hr>
<pre>From: {{ fromDate | json }} </pre>
<pre>To: {{ toDate | json }} </pre>
组件:
import { Component, OnInit } from '@angular/core';
import { NgbCalendar } from '@ng-bootstrap/ng-bootstrap';
import { NgbDate } from '@ng-bootstrap/ng-bootstrap/datepicker/ngb-date';
@Component({
selector: 'ngbd-datepicker-range',
templateUrl: './datepicker-range.html',
styles: [`
.custom-day {
text-align: center;
padding: 0.185rem 0.25rem;
display: inline-block;
height: 2rem;
width: 2rem;
}
.custom-day.focused {
background-color: #e6e6e6;
}
.custom-day.range, .custom-day:hover {
background-color: rgb(2, 117, 216);
color: white;
}
.custom-day.faded {
background-color: rgba(2, 117, 216, 0.5);
}
`]
})
export class NgbdDatepickerRange {
hoveredDate: NgbDate;
fromDate: NgbDate;
toDate: NgbDate;
constructor(calendar: NgbCalendar) {
this.fromDate = calendar.getToday();
this.toDate = calendar.getNext(calendar.getToday(), 'd', 10);
}
onDateSelection(date: NgbDate) {
if (!this.fromDate && !this.toDate) {
this.fromDate = date;
} else if (this.fromDate && !this.toDate && date.after(this.fromDate)) {
this.toDate = date;
} else {
this.toDate = null;
this.fromDate = date;
}
}
isHovered(date: NgbDate) {
return this.fromDate && !this.toDate && this.hoveredDate && date.after(this.fromDate) && date.before(this.hoveredDate);
}
isInside(date: NgbDate) {
return date.after(this.fromDate) && date.before(this.toDate);
}
isRange(date: NgbDate) {
return date.equals(this.fromDate) || date.equals(this.toDate) || this.isInside(date) || this.isHovered(date);
}
}
我能够在外部项目中成功实现此目标,但是当我插入到现有项目中时,我遇到了问题。任何帮助将不胜感激,我不知道。
答案 0 :(得分:1)
这只是他们官方文档中的错字问题。 在ng-template中,日期不作为输入传递,这就是为什么它会产生未定义的错误。
<ng-template #t let-date let-focused="focused">
将此更改为
<ng-template #t let-date="date" let-focused="focused">
答案 1 :(得分:0)
我认为的问题是您使用的ng-bootstrap版本与您的angular版本不兼容。 您可以找到兼容的here。
对于Angular 6,我使用的是3.3.1版本。这是命令:
npm install --save @ ng-bootstrap / ng-bootstrap @ 3.3.1