Javascript 以降序显示帖子
我正在尝试测试Firebase,以允许用户使用Javascript 以降序显示帖子,javascript,firebase,Javascript,Firebase,我正在尝试测试Firebase,以允许用户使用push发布评论。我想显示我检索到的数据,如下所示: fbl.child('sell').limit(20).on("value", function(fbdata) { // handle data display here } 问题是数据是按从最早到最新的顺序返回的-我希望按相反的顺序返回。Firebase可以这样做吗 自编写此答案以来,Firebase添加了一项功能,允许按任何子级或按值排序。因此,现在有四种方式对数据进行排序:按键、按
push
发布评论。我想显示我检索到的数据,如下所示:
fbl.child('sell').limit(20).on("value", function(fbdata) {
// handle data display here
}
问题是数据是按从最早到最新的顺序返回的-我希望按相反的顺序返回。Firebase可以这样做吗
自编写此答案以来,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().limitToLast(20).on('child_added', function(fbdata) {
console.log(fbdata.exportVal());
})
在我的测试中,使用on('child_added'
确保最后添加的几个子项按相反的时间顺序返回。另一方面,使用on('value'
)按名称顺序返回它们
请务必阅读,其中解释了如何使用child.*
事件来检索(有序)子项
一个箱子来证明这一点:
自编写此答案以来,Firebase添加了一项功能,允许按任何子项或值排序。因此,现在有四种方式对数据排序:按键、按值、按优先级或按任何命名子项的值。请参见此
基本方法保持不变,但:
1.添加一个具有反转时间戳的子属性,然后对其排序
2.按升序读取子项,然后在客户端上反转它们
Firebase支持通过两种方式检索集合的子节点:
- 名字
- 按优先顺序
您现在得到的是名称,它恰好是按时间顺序排列的。顺便说一句,这不是巧合:当您将项目推入集合时,会生成名称以确保子项按此方式排序。引用:
push()生成的唯一名称的前缀是客户机生成的时间戳,因此结果列表将按时间顺序排序
在这个话题上,他有这样一句话:
数据的排序方式
默认情况下,Firebase节点上的子节点按名称按字典顺序排序
可以生成自然按时间顺序排序的子名称,但许多应用程序要求以其他方式对其数据进行排序。Firebase允许开发人员通过为每个项目指定自定义优先级来指定列表中项目的顺序
获取所需行为的最简单方法是在添加项目时还指定一个始终递减的优先级:
var ref = new Firebase('https://your.firebaseio.com/sell');
var item = ref.push();
item.setWithPriority(yourObject, 0 - Date.now());
更新
您还必须以不同的方式检索子对象:
fbl.child('sell').startAt().limitToLast(20).on('child_added', function(fbdata) {
console.log(fbdata.exportVal());
})
在我的测试中,使用on('child_added'
确保最后添加的几个子项按相反的时间顺序返回。另一方面,使用on('value'
)按名称顺序返回它们
请务必阅读,其中解释了如何使用child.*
事件来检索(有序)子项
一个bin来证明这一点:为了补充Frank的答案,也可以通过简单地使用endAt()来获取最新的记录(即使您没有费心使用优先级排序)。限制(x)
,如下所示:
请注意,即使是多达1000条记录(假设有效负载很小),这也是相当有效的。对于更健壮的用法,Frank的答案是权威的,并且更具可扩展性
通过监视child\u added
/child\u remove
/child\u moved
事件代替value
,并使用一个应用程序批量而不是单独应用DOM更新,也可以优化这种暴力,以处理更大的数据或更多的记录
当然,DOM更新无论采用哪种方法都是一个棘手的问题,一旦你进入数百个元素,那么debounce方法(或者React.js解决方案,本质上是uber debounce)是一个很好的工具。为了补充Frank的答案,也可以通过简单地使用endAt()。限制(x)
来获取最新的记录,即使您没有费心使用优先级排序:
请注意,即使是多达1000条记录(假设有效负载很小),这也是相当有效的。对于更健壮的用法,Frank的答案是权威的,并且更具可扩展性
通过监视child\u added
/child\u remove
/child\u moved
事件代替value
,并使用一个应用程序批量而不是单独应用DOM更新,也可以优化这种暴力,以处理更大的数据或更多的记录
当然,DOM更新是一个讨厌的东西,不管采用什么方法,一旦你进入了这个领域
fbl.child('sell').orderByValue().limitLast(20).on("value", function(fbdataSnapshot) {
// fbdataSnapshot is returned in the ascending order
// you will still need to order these 20 items in
// in a descending order
}
var offsetRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/.info/serverTimeOffset");
offsetRef.on("value", function(snap) {
var offset = snap.val();
var estimatedServerTimeMs = new Date().getTime() + offset;
});
myFirebaseRef.orderByChild("highScore").limitToLast(4)
import React, { Component, PropTypes } from 'react';
import ReactMixin from 'react-mixin';
import ReactFireMixin from 'reactfire';
import Firebase from '../../../utils/firebaseUtils'; // Firebase.initializeApp(config);
@ReactMixin.decorate(ReactFireMixin)
export default class Add extends Component {
constructor(args) {
super(args);
this.state = {
articles: []
};
}
componentWillMount() {
let ref = Firebase.database().ref('articles').orderByChild('insertDate').limitToLast(10);
this.bindAsArray(ref, 'articles'); // bind retrieved data to this.state.articles
}
render() {
return (
<div>
{
this.state.articles.reverse().map(function(article) {
return <div>{article.title}</div>
})
}
</div>
);
}
}
query.orderByChild('sell').limitToLast(4).on("value", function(snapshot){
snapshot.forEach(function (childSnapshot) {
// PREPEND
});
});
query=mCommentsReference.orderByChild("date_added");
query.keepSynced(true);
// Initialize Views
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
mManager = new LinearLayoutManager(getContext());
// mManager.setReverseLayout(false);
mManager.setReverseLayout(true);
mManager.setStackFromEnd(true);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(mManager);
llManager.setReverseLayout(true);
llManager.setStackFromEnd(true);
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
final SuperPost superPost = superList.get(getItemCount() - position - 1);
}
ref.subscribe(snapshots => {
this.loading.dismiss();
this.items = [];
snapshots.forEach(snapshot => {
this.items.push(snapshot);
});
**this.items.reverse();**
},
const timestamp = new Date().getTime();
const data = {
name: 'John Doe',
city: 'New York',
sort_key: timestamp * -1 // Gets the negative value of the timestamp
}
const ref = firebase.database().ref('business-images').child(id);
const query = ref.orderByChild('sort_key');
return $firebaseArray(query); // AngularFire function
.reverse {
display: flex;
flex-direction: column-reverse;
}
const query = messagesRef.orderBy('createdAt', 'asc').limitToLast(25);