我只想获取一个列表一次,然后将其保存在内存中并使用 child_added 来处理正在创建的项目。
仅使用 child_added
对我来说很不方便,因为这样做会导致我为每个 child_added
事件重新渲染整个列表。我宁愿在页面加载时渲染整个列表,然后再渲染每个添加的项目。
我的代码:
ref.once('value', (snapshot) => {
let messages = []
snapshot.forEach(function(childSnapshot) {
let messageKey = childSnapshot.key
let message = childSnapshot.val()
messages.push(message)
})
// Render messages list once
ref.on('child_added', (message) => {
const messageVal = message.val()
// Append message and re-render list
}
})
问题是我仍然收到每个现有节点的 child_added 事件。
最明智的做法是跟踪我已经处理的项目并在 child_added
中忽略它们吗?或者有没有办法只获取新的更新?
谢谢
最佳答案
如果您引入了一种方法来准确确定在任何给定时间点哪些项目是"new"的,则可以在“child_added”查询中使用该方法来继续“value”查询停止的位置。例如,如果您的数据项具有与每个项目关联的时间戳,并且您知道从“value”查询收到的所有项目的最新时间戳,请修改“child_added”查询以仅筛选 >= 该时间戳的项目。
如果您的数据不能帮助您创建像这样的基于时间的自然排序,或者您已经用尽了 RTDB 查询允许的过滤器,我认为您没有什么其他可以做的(除了可能转移到 Firestore,它为您提供多个过滤器)。
关于javascript - Firebase:获取现有数据一次,然后使用child_added获取新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48671081/