【发布时间】: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 - 所以任何关于这方面的帮助也会很棒。
非常感谢, G
【问题讨论】:
-
请编辑您的问题以包含 JSON 结构的最小 sn-p。您可以通过单击 Firebase Database console 中的“导出 JSON”链接来获取此信息。
-
添加了@FrankvanPuffelen
-
您是否尝试在添加新项目之前清除列表?我想在你的点击事件监听器中添加
ulList.innerHTML = ''会给你这个。 -
您好 Gustavo,这是我尝试过的方法 - 几天前我想尝试一下。但是,它会产生一个奇怪的故障。当我单击排序按钮时,它排序正常。但是当我尝试添加新书时,它会显示新书两次。但是当我刷新页面时,它只显示一次。很奇怪
标签: javascript jquery firebase firebase-realtime-database