0

I get an error message that I don't quite understand. The trace log does not say much. I don't know where this message is coming from. The webapp works as usual, but the browser debugger tool is slow because the error is thrown very often at once.

I unsubscribe all the observables via @UntilDestroy({ checkProperties: true }) from the library @ngneat/until-destroy": "^8.1.3 on Angular 11.

What is this error? Why does it occur and how can it be prevented?

node_module/@angular/core/ivy_ngcc/fesm2015/core.js:5980: ObjectUnsubscribedErrorImpl {message: "object unsubscribed", name: "ObjectUnsubscribedError"}

e.g.

@UntilDestroy({ checkProperties: true })
@Component({
  selector: 'diagram-card',
  template: `
    <widget-diagram></widget-diagram>
  `,
  styleUrls: ['./diagram-card.component.scss'],
})
export class DiagramCardComponent implements OnInit {
  ...
}

Edit:

@Component({
  selector: 'diagram-card',
  template: `
    <widget-diagram [data$]="values$"></widget-diagram>
  `,
  styleUrls: ['./diagram-card.component.scss'],
})
export class DiagramCardComponent implements OnInit {
  public deviceId: string;
  public dashboardId: string;

  @Input()
  public widgetId: string;

  public widget$: ReplaySubject<DashboardWidget> = new ReplaySubject<DashboardWidget>(1);
  public itemHistory$: ReplaySubject<DeviceHistoryItemEntry[]> = new ReplaySubject<DeviceHistoryItemEntry[]>(1);

  public values$: ReplaySubject<TimeSeries[]> = new ReplaySubject<TimeSeries[]>(1);

  constructor(
    private store: Store,
    private route: ActivatedRoute,
    private loggerApi: LoggerApi,
    private manageDeviceHistoryUsecase: ManageDeviceHistoryUsecase
  ) {}

  public ngOnInit(): void {
    this.onLoadUrlParam();
    this.loadDeviceHistory();
    this.onLoadWidget();
    this.onUpdate();
  }

  private onUpdate(): void {
    this.widget$
      .pipe(
        debounceTime(500),
        distinctUntilChanged(),
        switchMap((widget) =>
          combineLatest([
            of(widget),
            this.store.select(DeviceHistoryStore.getItemHistoryEntries(this.deviceId, widget.data[0].itemId)),
          ])
        )
      )
      .subscribe(([widget, deviceHistory]) => {
        this.loggerApi.debug('Update diagram of item ' + widget.data[0].itemId);

        const diagram: TimeSeries[] = [];
        const points: ChartPoint[] = [];

        // Add all data points
        deviceHistory.forEach((entry) => {
          points.push({
            name: entry.timestampId.toLocaleString(),
            value: entry.state,
          });
        });

        // Add time series to diagram
        diagram.push({
          name: widget.name,
          series: points,
        });

        this.values$.next(diagram);
      });
  }

  private loadDeviceHistory(): void {
    this.widget$.pipe(take(1)).subscribe((widget) => {
      const dateFrom = new Date();
      dateFrom.setDate(dateFrom.getDate() - 7);
      this.manageDeviceHistoryUsecase.loadDeviceItemHistory(this.deviceId, widget.data[0].itemId, {
        from: dateFrom,
        to: new Date(Date.now()),
        samplingMethod: SamplingMethodType.NONE,
      });
    });
  }

  private onLoadWidget(): void {
    this.store
      .select(DashboardStore.getWidgetFromDashboard(this.widgetId, this.dashboardId))
      .pipe(distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)))
      .subscribe((widget) => {
        this.widget$.next(widget);
      });
  }

  private onLoadUrlParam(): void {
    this.route.params.subscribe((param) => {
      this.dashboardId = param.dashboardId;
    });
    this.route.parent.params.subscribe((param) => {
      this.deviceId = param.deviceId;
    });
  }
}

laprof
  • 1,246
  • 3
  • 14
  • 27
  • can you post the whole code of the Component? – Tobias S. Aug 21 '21 at 22:00
  • I have updated the post. I have unsubscribed all observables with `@UntilDestroy({ checkProperties: true })` on over 40 components. I just removed all annotations. The observables are then no longer unsubscribed, but the error no longer occurs. Now the question is which is the best way handle the unsubscribing of the observables. – laprof Aug 21 '21 at 23:19
  • Does this question/answer fit your problem? https://stackoverflow.com/questions/67235013/objectunsubscribederrorimpl-on-an-observable-in-a-template-in-angular/67280960#67280960 – Jonathan Stellwag Aug 24 '21 at 12:53

0 Answers0