Временно прекратить прослушивание источника событий на компоненте - PullRequest
0 голосов
/ 19 марта 2019

У меня есть общий компонент [date-range-selector], в этом компоненте при изменении значений даты он выдает новые значения как таковые

@Output() changeEvent = new EventEmitter();
//unimportant code
this.changeEvent.emit({ from: moment(from), to: moment(to) });

Теперь в моем приложении есть [ОчиститьФильтры] кнопка, которая сбрасывает диапазон дат до значения по умолчанию, но это заставляет компонент снова запускать код changeEvent.emit

Как я могу отключить излучатель, изменить значения, затем снова включить излучатель или я собираюсьоб этом не так?

Можно ли удалить слушателя из родительского и затем динамически подключить его?

Вот компонент на панели фильтров

<so-date-selector class="date-selector"
  #CreationDate
  [from]="fromDate"
  [to]="toDate"
  [allowCalendar]="false"
  [allowRange]="true"
  placeholderText="Creation Date"
  (changeEvent)="creationDateChange($event)"
>
<button mat-stroked-button (click)="resetFilters()" class="clear-filter">Clear Filters</button>

внутри so-date-selector у меня есть это

<section *ngIf="allowRange">
  <ngx-mat-drp (selectedDateRangeChanged)="updateRange($event)" [options]="options" #dateRangePicker></ngx-mat-drp>
</section>

updateRange вызывает функцию emit, а затем в моем родительском компоненте у меня есть

 resetFilters() {
    this._service.filtersInitialised = false;
    this.sourceFilter.setValue("All Sources");
    this.fromDate = moment(new Date()).subtract(14, 'days').startOf('day');
    this.toDate = moment(new Date()).clone().endOf('day');
    this._service.filtersInitialised = true;
  }

и затем в сервисе

loadIssues() {
    if (this.filtersInitialised) {
//do stuff
}

Таким образом, ни один из моих других фильтров не запускает событие, когда я проверяю this._service.filtersInitialised, однако селектор даты срабатывает, и я полагаю, что он генерируется после сброса моего логического значения

HopЭто делает его немного понятнее

  updateRange(range: Range) {
      this._emit(moment(range.fromDate), moment(range.toDate));
  }

  private _emit(from: moment.Moment, to: moment.Moment) {
    if (this._isInitialised) {
      this.changeEvent.emit({ from: moment(from), to: moment(to) });
    }
  }

Итак, что я имел в предыдущем примере, это: this._isInitialised && this.emitEnabled

с emitEnabled, являющимся логическим Input ()

затем в моем потребителе я установил emitEnabled = false, в то время как я сбросил значения даты, затем снова включил его, но выброс все еще срабатывал, так что я думаю, что дочерний элемент управления немного отставал от родителя, поэтому к тому времени, когда он нажал на функцию emitэто логическое значение вернулось к истине

[Окончательное обновление] Я думаю, что ответ довольно прост, этого нельзя сделать, так как он не имеет смысла.Вот мой основной рабочий процесс, который объясняет, почему

Хорошо, представьте, что у нас есть 3 компонента: Родитель - Ребенок - Тревога

Родитель слушает ребенка, который слушает тревогу

Если яустановите для родителей запрет на прослушивание ребенка, затем включите таймер для будильника, затем снова начните слушать ребенка.Когда сработает будильник, ребенок уведомит родителя, потому что он снова слушает.Хотя причина, по которой произошло действие, произошла, когда родитель был отключен

Так что проблема в моем сценарии из реальной жизни заключается в том, что по какой-то причине он работает медленно и уведомляет меня, когда я снова начинаю слушать.

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