【问题标题】:Sorting Firebase data on button click在按钮单击时对 Firebase 数据进行排序
【发布时间】:2017-05-25 08:43:04
【问题描述】:

目前在我的应用程序中,我正在显示我的 Firebase 数据库中的书籍列表:

我想要一个点击事件,当点击 A-Z 图标(如图所示)时,列表按字母顺序排序。

代码 sn-ps 显示了我目前所拥有的:

var myFirebase = new Firebase('https://project04-167712.firebaseio.com/object/Book/');

const ulList = document.getElementById('list');
const dbRefObject = firebase.database().ref().child('object');
const dbRefList = dbRefObject.child('Book');

var sort = document.querySelector('#sort');

sort.addEventListener("click", function() {
  //Where I want the sort event to go
  //So far I have this:
  dbRefList.orderByChild('book').on('child_added', snap => {
      const li = document.createElement('li');
      li.innerText = snap.val().book;
      li.id = snap.key;
      ulList.appendChild(li);

    });
    //This is taken directly from the child added but changed to orderByChild. 
    //It sorts the list but of course just re prints it below the unsorted list.
});

dbRefList.on('child_added', snap => {
      const li = document.createElement('li');
      li.innerText = snap.val().book;
      li.id = snap.key;
      ulList.appendChild(li);

    });

    dbRefList.on('child_changed', snap => {
      const liChanged = document.getElementById(snap.key);
      liChanged.innerText = snap.val().book;

    });

    dbRefList.on('child_removed', snap => {
      const liToRemove = document.getElementById(snap.key);
      liToRemove.remove();
      
    });
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

<div id="sortContainer">
            <i id="sort" class="material-icons">sort_by_alpha</i>
        </div>

我知道我应该使用 orderByChild - 我只是不确定如何实施。我将 'child_added' 函数调整为 orderByChild,它确实对列表进行了排序,但将其打印在原始排序列表的下方:

请任何人告知最有效的列表排序方式是 onClick。在某些时候,我也希望能够以相反的顺序对列表进行排序 - Z-A - 所以任何关于这方面的帮助也会很棒。

这是firebase JSON文件的屏幕截图:

非常感谢, G

【问题讨论】:

  • 请编辑您的问题以包含 JSON 结构的最小 sn-p。您可以通过单击 Firebase Database console 中的“导出 JSON”链接来获取此信息。
  • 添加了@FrankvanPuffelen
  • 您是否尝试在添加新项目之前清除列表?我想在你的点击事件监听器中添加ulList.innerHTML = '' 会给你这个。
  • 您好 Gustavo,这是我尝试过的方法 - 几天前我想尝试一下。但是,它会产生一个奇怪的故障。当我单击排序按钮时,它排序正常。但是当我尝试添加新书时,它会显示新书两次。但是当我刷新页面时,它只显示一次。很奇怪

标签: javascript jquery firebase firebase-realtime-database


【解决方案1】:

问题在于您的这部分代码:

dbRefList.orderByChild('book').on('child_added', snap => {
    const li = document.createElement('li');
    li.innerText = snap.val().book;
    li.id = snap.key;
    ulList.appendChild(li);
});

您正在未排序的下方再次创建一个新的 li。清除父列表,然后追加。

ulList.innerHTML = '';

将此添加到您的 sortEventListener 函数中。它应该可以工作。

【讨论】:

  • 感谢您的回答 Anand,但正如我之前对您的评论中所述,此解决方案会导致应用程序出现故障。虽然它可以工作,但它会与应用程序的其他元素混淆
  • 使用一些 css 来固定列表容器的高度并使其可滚动
  • 这不是问题。您所说的 JS 会与实际数据混淆并复制书籍
  • 不应该。您在dbRefList.orderByChild('book').on('child_added', snap =&gt; { 之前添加ulList.innerHTML = '' 对吗?
  • 我补充说是的。我不认为这可能是问题 - 所有这些 JS 都包含在 window.onload = function() {
猜你喜欢
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2020-02-03
  • 2014-12-18
  • 1970-01-01
  • 2020-03-28
相关资源
最近更新 更多