我正在尝试进行 Firestore 反应式分页。我知道有帖子、评论和文章说这是不可能的,但无论如何......
当我添加一条新消息时,它会启动或“删除”上一条消息
这是主要代码。我一次分页 4 条消息
async getpaginatedRTLData(queryParams: TQueryParams,onChange: Function){
let collectionReference = collection(firestore,queryParams.pathToDataInCollection);
let collectionReferenceQuery = this.modifyQueryByOperations(collectionReference,queryParams);
//Turn query into snapshot to track changes
const unsubscribe = onsnapshot(collectionReferenceQuery,(snapshot: Querysnapshot) => {
snapshot.docChanges().forEach((change: DocumentChange<DocumentData>) => {
//Now save data to format later
let formattedData = this.storeData(change,queryParams)
onChange(formattedData);
})
})
this.unsubscriptions.push(unsubscribe)
}
为了完整性,这就是我构建查询的方式
let queryParams: TQueryParams = {
limitResultCount: 4,uniqueKey: '_id',pathToDataInCollection: messagePath,orderBy: {
docField: orderByKey,direction: orderBy
}
}
modifyQueryByOperations(
collectionReference: CollectionReference<DocumentData> = this.collectionReference,queryParams: TQueryParams) {
//Extract query params
let { orderBy,where: where_param,limitResultCount = paginate} = queryParams;
let queryCall: Query<DocumentData> = collectionReference;
if(where_param) {
let {searchByField,whereFilterOp,valueToMatch} = where_param;
//collectionReferenceQuery = collectionReference.where(searchByField,valueToMatch)
queryCall = query(queryCall,where(searchByField,valueToMatch) )
}
if(orderBy) {
let { docField,direction} = orderBy;
//collectionReferenceQuery = collectionReference.orderBy(docField,direction)
queryCall = query(queryCall,fs_orderBy(docField,direction) )
}
if(limitResultCount) {
//collectionReferenceQuery = collectionReference.limit(limitResultCount)
queryCall = query(queryCall,limit(limitResultCount) );
}
if(this.lastDocInSortedOrder) {
//collectionReferenceQuery = collectionReference.startAt(this.lastDocInSortedOrder)
queryCall = query(queryCall,startAt(this.lastDocInSortedOrder) )
}
return queryCall
}
当我向集合中添加新消息时,看到最后一行已删除。更糟糕的是它并不一致。我对此进行了调试,Firestore 正在删除该消息。
我几乎觉得这是 Firestore 处理侦听器的错误