javascript - 使用 endAt 加载更多数据

标签 javascript firebase firebase-realtime-database

我最初使用 limitToLast(5) 从我的数据库节点加载最后 5 个项目,如下所示:

var myData = [];
var firstKey;

var fetchInitialData(category){
    firebase.database().ref(category).orderByKey().limitToLast(5).once('value' , function(snap){
        addDatToArray(snap);
    });
}

fetchInitialData('myCategory');

var addDatToArray = function(snap){
    snap.forEach(function(child){
        myData.push(child.val());
        if(!firstKey){
            firstKey = child.key;
        }
    });
}

我有一个加载更多按钮,它可以再获取 5 个项目并将其推送到 myData[]。由于我将 firstKey 存储在初始提取中,因此我将其传递给 endAt(),如下所示:

var fetchMoreData(category){
    firebase.database().ref(category).orderByKey().endAt(firstKey).limitToLast(5).once('value' , function(snap){
        firstKey = null;
        addDatToArray(snap);
    });
}

它工作正常,但问题是因为我正在使用 endAt() 获取更多数据并限制数据,并且 endAt() 也包括结尾品脱的项目。因此,对于每次加载更多数据,myData 数组中都会复制一项。

为了便于描述,请考虑以下示例:

我的数据结构

----category
    --item1
    --item2
    --item3
    --item4
    --item5
    --item6
    --item7
    --item8
    --item9
    --item10

1. 在初始获取时,我获取最后 5 个项目,即项目 6-10,并且 firstKey 设置为 item6。 显示给用户的项目是

item6
item7
item8
item9
item10

2. 在加载更多时获取 firstKey,即 item6 被传递给 endAt() 并且由于 endAt() 是包容性的,它还获取 item6 并将其推送到 myData[]

显示给用户的项目是

item6
item7
item8
item9
item10

item5
item4
item3
item2
item6//fetched again

如何克服这个问题

最佳答案

在向数组添加数据时,如果子项与 endAt 查询的键匹配,您可以忽略它吗?所以您的 addDatToArray 方法将需要一个参数,例如:

var addDatToArray = function(snap, ignoreKey){
    snap.forEach(function(child){
        if(child.key != ignoreKey) {
            myData.push(child.val());
        }
        if(!firstKey){
            firstKey = child.key;
        }
    });
}

来自 firebase.database.Query#endAt 的文档:

The ending point is inclusive, so children with exactly the specified value will be included in the query.

因此,您需要通过将 limitToLast 调整 +1 然后丢弃重复结果来解决这个问题。

关于javascript - 使用 endAt 加载更多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46665366/

相关文章:

javascript - Chrome(适用于 Android)媒体查询做错了?

javascript - 动态创建对象

javascript - onChange() 不是函数。手动触发 onChange()

javascript - typescript : logic to covert string array into custom object

javascript - AngularJS $scope.$apply() 困境

ios - (Swift) Firebase keepSynced(true) 不起作用

firebase - Flutter 和 Firestore 在请求中没有用户信息

ios - 从 Firebase 获取数据的最有效方式

ios - FireBase - 维护/保证数据一致性

javascript - 错误 错误 : Reference. 设置失败:第一个参数在属性中包含无效键 ($key)