暂时停止侦听组件上的事件发射器

时间:2019-03-19 16:57:31

标签: angular typescript angular-event-emitter

我有一个共同的组件[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时,没有其他过滤器会触发该事件,但是日期选择器被触发了,我的猜测是因为它在重置了布尔值后便发出了

希望它变得更加清晰

  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

带有elementEnabled的布尔输入()

然后在我的使用者中,我在重置日期值时设置了enableEnabled = false,然后再次启用了它,但是仍然触发了发射操作,因此我的想法是子控件在父控件后面稍稍运行,所以在到达发射控件时布尔值恢复为真的函数

[最终更新] 我认为答案很简单,因为没有意义,所以无法完成。这是我关于工作流程的基本思路

好吧,想象一下我们有3个组成部分 父母-孩子-警报

父母在听孩子在听闹钟

如果我将父母设置为不听孩子,则在闹钟上启动计时器,然后再次开始听孩子。警报响起时,孩子会通知父母,因为孩子再次在听。即使导致该行为的原因是在父母被设置为不听话的情况下发生的

所以我现实生活中的问题是由于某种原因,它很慢,并且在我再次开始收听后会通知我。

0 个答案:

没有答案