Класс доступа от провайдеров - PullRequest
0 голосов
/ 26 ноября 2018

Я использую указатель времени из библиотеки NG Bootstrap , но я хочу переключать дату при прокрутке после полуночи.Я использую пользовательский адаптер времени для моделирования даты как даты, а не объекта NgbTimeStruct, и я кэширую дату в адаптере, поэтому при преобразовании из NgbTimeStruct она преобразуется в правильную дату.

Проблема возникает, когда я хочу изменить дату из компонента.В этом случае мне нужно вызвать метод на адаптере времени, который может изменить кэшированную дату, но у меня нет доступа к экземпляру класса адаптера.

Я предоставляю его компоненту, которыйиспользует его в массиве провайдеров:

providers: [
  { provide: NgbTimeAdapter, useClass: NgbTimeDateAdapter }
]

В том же компоненте я хочу изменить дату, вызвав метод NgbTimeDateAdapter.updateCachedDate для класса, но он должен обновить кэшированное значение в том же экземплярекак тот, который используется таймером.Если я отдельно предоставлю адаптер для компонента, я смогу вызвать метод, который мне нужен, но это другой экземпляр, поэтому не сильно помогу.

@Component({
  selector: 'app-time-component',
  templateUrl: './time.component.html',
  styleUrls: ['./time.component.css'],
  providers: [
    NgbTimeDateAdapter,
    { provide: NgbTimeAdapter, useClass: NgbTimeDateAdapter }
  ]
})
export class TimeComponent implements OnInit {
  constructor (
    private ngbTimeDateAdapter: NgbTimeDateAdapter
  ) { }

  // ...

  setAsNextDay () {
    this.ngbTimeDateAdapter.updateCachedDate(1);
  }
  setAsPreviousDay () {
    this.ngbTimeDateAdapter.updateCachedDate(-1);
  }

}

Как получить доступ к правильному экземпляру класса, который был введен с помощьюмассив провайдеров с методом useClass?

NgbTimeDateAdapter

@Injectable()
export class NgbTimeDateAdapter extends NgbTimeAdapter<Date> {
  // This class is used for converting between ngBootstrap timepicker times and JavaScript dates. As we need the date as well as well as the time, we must cache the date when first converting the time to the NgbTimeStruct and reuse it when converting the NgbTimeStruct to a date.
  cachedDate: Date;
  fromModel (value: Date): NgbTimeStruct {
    if (!value) {
      return null;
    }

    this.cachedDate = new Date(value.getTime());
    return {
      hour: value.getHours(),
      minute: value.getMinutes(),
      second: value.getSeconds()
    };
  }
  toModel (time: NgbTimeStruct): Date {
    if (!time) {
      return null;
    }

    const returnDate = this.cachedDate ? new Date(this.cachedDate.getTime()) : new Date();
    returnDate.setHours(time.hour);
    returnDate.setMinutes(time.minute);
    returnDate.setSeconds(time.second);
    returnDate.setMilliseconds(0);
    return returnDate;
  }

  updateCachedDate (offsetDays: number): void {
    // When scrolling the timepicker onto a different day, we need a way to handle it. The component with the datepicker must call this method to adjust the date as appropriate.
    if (this.cachedDate) {
      this.cachedDate.setDate(this.cachedDate.getDate() + offsetDays);
    }
  }
}
...