Правильный способ вернуть true / false в логический метод TypeScript / JavaScript? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь отключить все даты, когда у пользователя уже зарегистрировано событие. Я использую 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;
  }

Если я сопоставлю массив 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 ()

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Ваша 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;
}
0 голосов
/ 10 января 2019

Ваша функция 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 в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...