You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic Firestore应用分页失效问题修复求助

概述

我现在卡在Firebase+Ionic的分页实现上,折腾了好久试各种方法、查资料,api.service里的queryFn1、queryFn2、queryFn3参数目前能用但还得优化,核心是分页逻辑搞不定。

说明

我对rxjs和observables完全不熟,就像刚学游泳的人在海里扑腾,根本不知道怎么追加、推送或者直接输出这些流式数据。

范围

听说combineWithLatest()可能能解决问题,但完全不知道怎么实现,现在彻底卡壳,不知道从哪下手。

建议征集

任何建议我都接受。

涉及文件
  • api.service.ts:负责和Firestore建立连接
  • chat.service.ts:获取users集合的数据
  • page.ts:包含getMoreItems方法,计划每次加载5条更多数据

page.ts 代码

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { ChatService } from 'src/app/services/chat/chat.service';

@Component({
  selector: 'app-community',
  templateUrl: './community.page.html',
  styleUrls: ['./community.page.scss'],
})
export class CommunityPage implements OnInit {

  users: Observable<any>;

  constructor(
    private chatService: ChatService
  ) { }

  ngOnInit() {
    this.getUsers(); // 获取所有社区用户
  }

  getUsers() {
    this.chatService.getUsers();
    this.users = this.chatService.users;    
  }

  //
  //无限滚动
  //

  private getMoreItems() {
    this.users.pipe().subscribe((users) => {
      let lastItem = users[users.length - 1];
      console.log('lastItem: ', lastItem);
      
      // 获取下5个用户
      this.chatService.getUsers(lastItem);
      this.users = this.chatService.users;
    });
  }

}

chat.service.ts 代码

public users: Observable<any>;

constructor(
  public api: ApiService
) { }

getId() {
  this.currentUserId = this.auth.getId()
}

getUsers(lastItem?) {
  // 获取userId
  this.getId();

  if(!lastItem) {
    this.users = this.api.collectionDataQuery(
    //this.api.collectionDataQuery(
      'users',
      //this.api.whereQuery('uid', '!=', this.currentUserId),
      //this.api.orderByQuery('uid', 'desc'),
      this.api.orderByQuery('lastSeen', 'desc'),
      this.api.limitQuery(5)
    )
  } else {
    let x = this.api.collectionDataQuery(
      'users',
      //this.api.whereQuery('uid', '!=', this.currentUserId),
      //this.api.orderByQuery('uid', 'desc'),
      this.api.orderByQuery('lastSeen', 'desc'),
      this.api.startAfterQuery(lastItem),
      this.api.limitQuery(5)
    )
    //this.users.push(x);
  }
}

api.service.ts 代码

import { Firestore, OrderByDirection, addDoc, collection, collectionData, doc, docData, getDoc, getDocs, limit, orderBy, query, setDoc, startAfter, updateDoc, where } from '@angular/fire/firestore';

collectionDataQuery(path, queryFn?, queryFn2?, queryFn3?) {
  let dataRef: any = this.collectionRef(path);
  
  // TODO: 此处逻辑需优化
  if(queryFn && queryFn2 && queryFn3) {
    console.log('queryFn && queryFn2 && queryFn3');
    const q = query(dataRef, queryFn, queryFn2, queryFn3);
    dataRef = q;
  } else if(queryFn && queryFn2) {
    const q = query(dataRef, queryFn, queryFn2);
    dataRef = q;
  } else if(queryFn) {
    const q = query(dataRef, queryFn);
    dataRef = q;
  }

  const collection_data = collectionData<any>(dataRef, {idField: 'id'});
  return collection_data;
}

whereQuery(fieldPath, condition, value) {
   return where(fieldPath, condition, value);
}

orderByQuery(fieldPath, directionStr: OrderByDirection = 'asc') {
  return orderBy(fieldPath, directionStr);
}

limitQuery(number) {
  return limit(number);
}

startAfterQuery(doc) {
  return startAfter(doc);
}

内容的提问来源于stack exchange,提问作者behicsakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:11:25