Поскольку этот ответ был написан, Firebase добавила функцию, которая позволяет упорядочивать любой дочерний элемент или значение. Таким образом, теперь есть четыре способа заказа данных: по ключу, по значению, по приоритету или по значению любого именованного дочернего элемента. [Gg]
Основные подходы остаются неизменными, хотя:
] 1. Добавьте дочернее свойство с инвертированной меткой времени, а затем закажите это.
2. Прочитайте их в порядке возрастания, а затем инвертируйте их на клиенте.
Firebase поддерживает извлечение дочерних узлов коллекции двумя способами:
- по имени
- по приоритету
То, что вы получаете сейчас, называется по имени, что бывает хронологическим. Это не совпадение кстати: когда вы
push
элемент в коллекцию, имя создается, чтобы гарантировать, что дети упорядочены таким образом. Чтобы процитировать документацию Firebase дляpush
:Уникальное имя, сгенерированное push (), имеет префикс с меткой времени, созданной клиентом, так что результирующий список будет хронологически отсортированы.
В руководстве Firebase по упорядоченным данным есть это сказать по теме:
Как данные упорядочены
По умолчанию дети в узле Firebase сортируются лексикографически по имени. Использование
push()
может генерировать дочерние имена, которые, естественно, сортируются в хронологическом порядке, но многие приложения требуют, чтобы их данные сортировались другими способами. Firebase позволяет разработчикам указывать порядок элементов в списке, указав собственный приоритет для каждого элемента.Самый простой способ получить нужное поведение - также указать всегда убывающий приоритет, когда вы добавите элемент:
var ref = new Firebase('https://your.firebaseio.com/sell'); var item = ref.push(); item.setWithPriority(yourObject, 0 - Date.now());
Обновить
Вам также придется искать детей по-другому:
fbl.child('sell').startAt().limit(20).on('child_added', function(fbdata) { console.log(fbdata.exportVal()); })
В моем тесте с использованием
on('child_added'
гарантирует, что последние несколько детей добавлены в обратном хронологическом порядке. С другой стороны, с помощьюon('value'
возвращает их в порядке их имени.Обязательно прочитайте раздел «Чтение упорядоченных данных» , в котором объясняется использование
child_*
события для извлечения (упорядоченных) детей.Бит для демонстрации этого: http://jsbin.com/nonawe/3/watch?js,console
Вот несколько проблем, которые я мог видеть с вашим кодом:
Я думаю, что добавил функциональность, которую вы хотели, вот код: https://codepen.io/anon/pen/MBaoxb?editors=0011
Изменения, которые я сделал, следующие:
Изменено так, что новые добавляемые ссылки могут увеличиваться на основе последнего числа, введенного в массив.
**Line 33:** var update1 = [links[links.length-1] + 1, links[links.length-1] + 2];
Удалены первые 2 ссылки из массива (так что позиция может быть установлена из индекса, так как в настоящее время настроен код в функции «update»).
**Line 56:** links = links.splice(2, links.length);