【问题标题】:How to create an observable array from a firestore DocumentReference array field如何从 firestore DocumentReference 数组字段创建可观察数组
【发布时间】:2019-08-12 16:28:04
【问题描述】:

我正在构建一个用于电子商务目的的 Firestore 数据库。目前我有一个产品根级集合和一个用户根级集合。 users 集合有一个名为 cart 的数组字段,我在其中存储了对该用户购物车中每个项目的 products 集合的 Documentreferences。我不确定从 DocumentReference 数组中正确形成 Observable<Product[]> 的最佳方法。

我目前有这样的工作,但我很肯定这不是最好的方法,它会导致应用程序出现问题。特别是因为每次组件订阅此 observable 时,服务都会为购物车中的每个项目创建一个新订阅,并且这些订阅永远不会取消订阅...

// Current method from cart service

getItems(): Observable<Product[]> {
  return this.auth.user.pipe(
    map((user: User): Product[] => {
      this.items = [];
      user.cart.forEach((item: firestore.DocumentReference) => {
        this.afs.doc(item.path).valueChanges().pipe(
          map((product: Product) => {
            this.items.push(product);
          })
        ).subscribe();
      });
      return this.items;
    })
  );
}

我希望能够查询登录用户的此字段并从购物车服务返回一个Observalbe&lt;Product[]&gt;,我可以订阅并使用它在组件中显示用户购物车中的项目。我对 rxjs 库的知识和理解相当初级,可能有一个操作员可以正确完成这项工作。提前感谢您的帮助!

【问题讨论】:

    标签: angular rxjs google-cloud-firestore angularfire


    【解决方案1】:

    要取消订阅在您的 service 中创建的 firestore observable,请尝试关注

    <!-- someName.component.ts -->
    import {Subscription} from 'rxjs';
    

    在你的组件类中

     private firestoreSubscription: Subscription;
    
    /* Your method to get data from firestore service */
    getCartData(){
    this.firestoreSubscription = this.service.getItems()
    .subsribe(data=>//your stuff);
    }
    

    并在AngularngOnDestroy() 生命周期钩子中取消订阅

    ngOnDestroy(){
    if (this.firestoreSubscription)
      this.firestoreSubscription.unsubscribe();
    }
    

    【讨论】:

    • 您好,感谢您的回答。我只是打算使用异步管道在我的 html 中解开 observable。问题是那些因为我订阅了服务中的单个文档而生成的其他订阅仍然不会被取消订阅。我正在寻找一种更好的方法来将 getItems() 方法构造到我不必在服务中订阅的地方。我一直在尝试查看 mergeMap 或 combineLatest form rxjs,但我仍在尝试弄清楚如何将它们用于我的用例。
    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2018-09-08
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多