Ionic&AngularFire2取消订阅可观察对象的最佳实践

时间:2018-06-21 20:10:49

标签: ionic-framework observable angularfire2

我有一个使用AngularFire2和Firestore的多页Ionic-Angular电话应用程序。我真正喜欢Firestore的一件事是数据的离线持久性。我的问题围绕着取消订阅AngularFire2流可观察对象的数据持久性和最佳实践。

我的主页是事件列表,选择事件后,应用程序将路由到具有该事件详细信息的单事件页面。目前,我根据单事件组件ngOnInit中Firestore中所选事件的文档ID使用AngularFire2 API订阅了单事件。

我对Angular中的可观察对象的理解是,建议当导航出组件时取消订阅可观察对象。但是,如果我在单事件组件中执行此操作,并且用户以某种方式失去了互联网连接,那么当他们导航到主页然后又返回到单事件时,将没有数据,因为流可观察对象已取消订阅,应用无法联系Firestore。现在,如果我不退订,那么即使脱机,单事件页面仍会显示数据。这是我想要的行为,但是在离开单事件页面时我不取消订阅可观察对象是否是一个问题?

即使在基于Ionic的电话应用中,取消订阅可观察对象是否也很重要?还是应该重新构建我的应用程序以实现所有最佳实践? 感谢您的任何投入!

1 个答案:

答案 0 :(得分:1)

  

即使在基于Ionic的电话应用中,取消订阅可观察对象是否也很重要?

是的,否则,如果您要离开该页面并返回,它将创建另一个对相同可观察对象的订阅,这将导致内存泄漏。

我知道有几种方法可以在您离开时停止订阅。
1.创建,分配和退订Subscription

foo$: Observable<Foo>;
fooSub: Subscription;

constructor() {
  this.fooSub = this.foo$.subscribe(foo => { console.log(foo); });
}

ionViewDidLeave() {
  this.fooSub.unsubscribe();
}

2。创建一个布尔值以限制订阅运行的时间。

active: boolean = true;
foo$: Observable<Foo>;

constructor() {
  this.foo$.takeWhile(() => this.active).subscribe(foo => { console.log(foo); });
}

ionViewDidLeave() {
  this.active = false;
}

ionViewDidLeave用于IonicPage组件,将ngOnDestroy用于自定义组件。

如果您希望数据在设备离线时仍然存在,则应查看ngrx/store