Я пытаюсь отключить все даты, когда у пользователя уже есть забронированное мероприятие. Я использую https://www.npmjs.com/package/ng-pick-datetime TypeScript и Angular 6. Мне удобнее работать с 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;
}
Если я сопоставлю массив disabledDays вместо forEach, я могу увидеть, что я получаю истинное значение для каждого события в bandedDays, которое должно изменить цвет в эти дни в календаре.
Но прямо сейчас метод 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? он должен возвращать логическое значение?
параметр d: Date возвращает все даты во всем календаре, и когда d равно дате в массиве запрещено, он должен возвращать логическое значение со значением true и отключать эту дату в календаре.
Я отредактировал пост
Так что в основном он отлично работает, когда я указываю индекс, например [0] или [1] и т. д., Но я не уверен, почему он не работает с forEach () или filter ()



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша функция myFilter всегда возвращает false.
return внутри this.forbiddenDays.forEach() только выходит из текущей итерации, но не приводит к остановке вашей функции. Вместо этого вы должны использовать 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
});
}
это вернет true, только если все элементы в массиве соответствуют data.start.getDate() !== d.getDate() и false в противном случае.
Возврат значения из forEach не прерывает цикл.
Я не говорил, что это так. Я сказал, что это прерывает итерацию, а не цикл.
И я говорю, что это ничего не ломает. Возвращаемое значение никуда не денется.
@HereticMonkey Вы знакомы с принципом работы .every()?
Конечно, но мы обсуждаем forEach. @jhpratt
Да, возвращаемое значение внутри forEach никуда не денется, но все равно прерывает текущую итерацию.
Выполните следующее: [1,2,3].forEach(i => { console.info(i); return false; }). Вы увидите 1 2 3, потому что итерация продолжается.
Я вижу, вы путаете итерацию и цикл. Запускаем [1,2,3].forEach(i => { console.info(i); return false; console.info('this is never print');});
Ты прав. Я перепутал эти два ... что заставляет думать, что, возможно, ваш ответ мог бы быть более ясным: P
@Guywhotypesfast, который сделал свое дело! Также приветствую отличное объяснение :)
Ваша функция myFilter всегда возвращает false. Возврат в обратном вызове forEach или filter - нет будет возвращать функцию myFilter. Он просто возвращает переданный вами обратный вызов, что в данном случае бессмысленно.
Я думаю, вам нужно что-то вроде этого:
public myFilter = (d: Date): boolean => {
return this.forbiddenDays.every(forbiddenDay => {
return forbiddenDay.start.getDate() !== d.getDate();
});
}
Метод array.every() возвращает false, если обратный вызов возвращает false для любого из элементов массива.
Вы также можете написать это с помощью цикла for..of:
public myFilter = (d: Date): boolean => {
for (let forbiddenDay of this.forbiddenDays) {
if (forbiddenDay.start.getDate() !== d.getDate()) {
return true;
}
}
return false;
}
Посмотрите на функцию
reduce.