[英]Right way to return true/false in boolean TypeScript/JavaScript method?
我正在尝试禁用用户已预订活动的所有日期。 我正在使用https://www.npmjs.com/package/ng-pick-datetime TypeScript和Angular6。我对Java较为满意,但可以自己学习一些Javascript。
.TS
getUserEvents() {
this._calendarService.getAllEvent().subscribe(res => {
this.allEvents = res.json();
});
}
filterForbiddenDays() {
this.allEvents.forEach(d => {
let day = {
'start': new Date(d.startDate.value),
'end': new Date(d.endDate.value)
};
this.forbiddenDays.push(day);
});
}
public myFilter = (d: Date): boolean => {
//return this.forbiddenDays[0].start.getDate() !== d.getDate() && this.forbiddenDays[1].start.getDate() !== d.getDate() // <-- THIS WORKS GREAT
this.forbiddenDays.filter(data => {
return data.start.getDate() !== d.getDate() // <-- TRUE SHOULD CHANGE COLOR ON DAY IN CALENDAR
});
return false;
}
如果我映射了forbiddenDays数组而不是forEach,我会看到我对forbiddenDays中的每个事件都是正确的,这应该更改日历中这些日期的颜色。
但是现在myFilter方法导致以下结果: 日历图片
我究竟做错了什么? 我觉得问题出在myFilter方法中。
.HTML
<div class="example-wrapper datePicker">
<label class="example-input-wrapper" id="eventInputSuccess">
<input (click)="filterForbiddenDays()" id="eventInputError" placeholder="Click to choose date"
(dateTimeInput)="basic.openModal()" [(ngModel)]="dateTimeInput" [owlDateTimeTrigger]="dt"
[owlDateTimeFilter]="myFilter" [owlDateTime]="dt"><i class="fa fa-calendar" aria-hidden="true"></i>
<owl-date-time #dt [pickerMode]="'dialog'"></owl-date-time>
</label>
</div>
</div>
提前致谢!
编辑:
return this.forbiddenDays[0].start.getDate() !== d.getDate();
结果: 预期结果,但在我的阵列中整天
因此,基本上,当我指定[0]或[3]等索引时,它的效果很好,但是我不确定为什么它不适用于forEach()或filter()
您的函数myFilter
始终返回false
。
this.forbiddenDays.forEach()
内部的return
仅打破当前的迭代,而不会导致函数停止。 你必须使用some
或every
来代替:
public myFilter = (d: Date): boolean => {
return this.forbiddenDays.every(data => {
return data.start.getDate() !== d.getDate() // <-- TRUE SHOULD CHANGE COLOR ON DAY IN CALENDAR
});
}
仅当数组中的所有元素都满足data.start.getDate() !== d.getDate()
,此方法才返回true
否则返回false
。
您的myFilter
函数始终返回false。 forEach
或filter
回调中的返回将不返回myFilter
函数。 它只是返回您传递给它的回调,在这种情况下,这毫无意义。
我认为您想要的是这样的:
public myFilter = (d: Date): boolean => {
return this.forbiddenDays.every(forbiddenDay => {
return forbiddenDay.start.getDate() !== d.getDate();
});
}
如果回调针对任何数组元素返回false
则array.every()
方法将返回false
。
您也可以使用for..of
循环编写此for..of
:
public myFilter = (d: Date): boolean => {
for (let forbiddenDay of this.forbiddenDays) {
if (forbiddenDay.start.getDate() !== d.getDate()) {
return true;
}
}
return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.