重新加载组件以供第二次使用后无法重新订阅行为主题

时间:2018-09-20 22:15:07

标签: angular typescript

我已阅读到,删除组件时应始终退订。在我的情况下,这发生在另一个子路由被激活,因此另一个子组件代替了之前的组件时。当我导航回第一个组件时,即使我再次订阅了behaviorsubject,也会收到错误object unsubscribed。防止此错误的唯一方法是从ngOnDestroy删除取消订阅的代码,但是behaviorsubject永远不会取消订阅。所以我很困惑。我什么时候应该退订?如果在删除子组件时不是,那么什么时候呢?这是我的代码:

export class TemperatureSettingsComponent implements OnInit, OnDestroy {
  data: any;
  temperatureForm: FormGroup;
  monthlyTemperatureCurve: number[];
  saveToLocalStorage:BehaviorSubject<any[]> = this.seedCalendarService.getSaveBehaviorSubject();
  useImperialMeasureSystem: boolean = true;
  options = {
    responsive: false,
    maintainAspectRatio: false
  };
  constructor(private fb: FormBuilder,
  private seedCalendarService: SeedCalendarService,
  private notificationService: NotificationService,
  private dataStoreService: DataStoreService) {
    this.saveToLocalStorage.subscribe(pair => {
      if(pair[0] === DataType.MEASURE_SYSTEM_PREFERENCE){
          this.useImperialMeasureSystem = pair[1]; 
      }
    });
    this.temperatureForm = fb.group({
      'january' : [''],
      'february' : [''],
      'march' : [''],
      'april' : [''],
      'may' : [''],
      'june' : [''],
      'july' : [''],
      'august' : [''],
      'september' : [''],
      'october' : [''],
      'november' : [''],
      'december' : ['']
    });
  }

  ngOnDestroy(){
    this.saveToLocalStorage.unsubscribe();
  }

您可以清楚地看到我在构造函数中重新订阅了behaviorSubjet到LocalStorage,但是似乎只有子组件的第一个实例才允许订阅和取消订阅。正在加载的子组件的每个连续实例都无法重新订阅,我发现这非常令人困惑,因为它是一个新实例。请澄清,谢谢。

1 个答案:

答案 0 :(得分:0)

如果您的子组件正在订阅父组件中的BehaviorSubject,则一旦您离开父组件(又名),它们将失去此订阅。当它被摧毁时。您的第一个孩子可能与您的父母在同一DOM上,因此它不会受到影响,但是您的第二个孩子则可能没有受到影响,因此它将失去对该主题的访问权限。

解决方案是将BehaviorSubject留在服务中,让您的父母/孩子订阅。