我有一个使用AngularFire2和Firestore的多页Ionic-Angular电话应用程序。我真正喜欢Firestore的一件事是数据的离线持久性。我的问题围绕着取消订阅AngularFire2流可观察对象的数据持久性和最佳实践。
我的主页是事件列表,选择事件后,应用程序将路由到具有该事件详细信息的单事件页面。目前,我根据单事件组件ngOnInit中Firestore中所选事件的文档ID使用AngularFire2 API订阅了单事件。
我对Angular中的可观察对象的理解是,建议当导航出组件时取消订阅可观察对象。但是,如果我在单事件组件中执行此操作,并且用户以某种方式失去了互联网连接,那么当他们导航到主页然后又返回到单事件时,将没有数据,因为流可观察对象已取消订阅,应用无法联系Firestore。现在,如果我不退订,那么即使脱机,单事件页面仍会显示数据。这是我想要的行为,但是在离开单事件页面时我不取消订阅可观察对象是否是一个问题?
即使在基于Ionic的电话应用中,取消订阅可观察对象是否也很重要?还是应该重新构建我的应用程序以实现所有最佳实践? 感谢您的任何投入!
答案 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。