【问题标题】:How to output the firebase snapshot in reverse order?如何以相反的顺序输出firebase快照?
【发布时间】:2023-03-18 06:20:02
【问题描述】:

我正在尝试从数据库中获取最新的 3 个数据并在 HTML 页面中以相反的顺序显示它们。

代码:

var refForevent = database.ref('/events/post');

refForevent.orderByChild("intro").limitToLast(3).on('child_added', function(snapshot){
    
    var eventlist = []

    eventlist.push(snapshot)
    console.log(eventlist)

    eventlist.reverse()
            
    document.getElementById("event1date").innerHTML = moment(eventlist[0].intro).format("MMM Do YYYY");
    document.getElementById("event1title").innerHTML = eventlist[0].title;

    document.getElementById("event2date").innerHTML = moment(eventlist[1].intro).format("MMM Do YYYY");
    document.getElementById("event2title").innerHTML = eventlist[1].title;

    document.getElementById("event3date").innerHTML = moment(eventlist[1].intro).format("MMM Do YYYY");
    document.getElementById("event3title").innerHTML = eventlist[1].title;
    
})

输出:Output that I am getting

数据库:

【问题讨论】:

  • 更新:对不起。它是 orderByChild("intro")。在这里发布之前我忘了更新它。我的错。
  • 在您的问题下方有一个edit 链接,以便您对问题进行类似的编辑。

标签: javascript html firebase firebase-realtime-database


【解决方案1】:

我看到intro 字段包含一个日期。

这是一种解决方案:

  1. 取这个字段的值
  2. 删除连字符分隔符(例如,从 2020 年 12 月 10 日起,您会得到数字 20201210)
  3. 将此数字乘以 -1
  4. 将结果值存储在另一个字段中
  5. 按此字段排序

或者(更优雅...),使用日期创建时间戳,将其乘以 -1 并按照上述说明使用它,即将结果值存储在另一个字段中并在该字段上排序。

【讨论】:

    【解决方案2】:

    由于您正在侦听 child_added 事件,因此您的函数将按照 Firebase 返回它们的顺序使用与查询匹配的每个帖子节点调用。所以你的eventlist 一次只能包含一个节点。

    要反转项目,您可以让 Firebase 以相反的顺序返回值,正如 Renaud 建议的那样(我还将在下面链接一些答案),或者您可以一次收听所有结果,然后反转客户端 -方面(因为您的代码似乎已经在尝试)。后者看起来像:

    var refForevent = database.ref('/events/post');
    
    refForevent.orderByChild("date").limitToLast(3).on('value', function(results){
        
        var eventlist = []
        results.forEach(function(snapshot) {
            eventlist.push(snapshot.val())
        });
    
        eventlist.reverse()
        console.log(eventlist);
                
        ...    
    })
    

    所以这个:

    • 侦听value 事件,而不是child_added,以便一次性获取所有匹配的子节点。
    • 如果 then 循环遍历结果,将它们添加到数组中,
    • 它在每个子快照上调用.val(),以从中获取值。

    有关降序排序的更多信息,另请参阅:

    【讨论】:

    • 这适用于第一个事件,它也是我想要的顺序。但我得到了一个错误“无法设置 null 的 innerHTML”。
    • 该错误似乎与 Firebase 交互无关,这正是我在这里提供的帮助。为了在 Stack Overflow 上获得最佳帮助,请尽可能隔离问题,如 how to create a minimal, complete, verifiable example 所示。
    • 好的。谢谢你:)
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多