我在/ messages端点上获得以下JSON响应:
{
"messages": [
{
id: 1,
sender: 2,
receiver: 1,
body: "this is a first comment",
created_at: "2016-09-05 10:00:00",
updated_at: "2016-09-05 10:00:00",
user: 2
},
{
id: 2,
sender: 1,
receiver: 2,
body: "this is a second comment",
created_at: "2016-09-05 11:00:00",
updated_at: "2016-09-05 11:00:00",
user: 2
},
{
id: 3,
sender: 3,
receiver: 1,
body: "this is a first comment",
created_at: "2016-09-05 12:00:00",
updated_at: "2016-09-05 12:00:00",
user: 3
},
{
id: 4,
sender: 1,
receiver: 3,
body: "this is a second comment",
created_at: "2016-09-05 13:00:00",
updated_at: "2016-09-05 13:00:00",
user: 3
},
]
}
这些是当前用户与其他用户的所有消息。 user
属性是当前用户与之进行对话的用户,无论是接收还是发送。我需要过滤这些消息,并只获取每个用户的最后一条消息。
在这个例子中,我最终会得到id为#1和3的消息。
继续前进我设置了路由messages/:user_id
,当你走到这条路线时,你可以看到与该特定用户交换的所有消息。
如果做过滤器我需要服务器端,那么当访问messages/:user_id
路由时,该用户的所有消息都将加载到商店中。然后当回到messages
时,我会收到以前在商店中加载的所有这些消息。
我已经提出Ember Twiddle来帮助说明这一点。
我正在调查mapBy和uniq方法,并且没有成功地使用它们。
非常感谢任何指示或建议。
答案 0 :(得分:1)
我会使用控制器模型上的观察者来做到这一点:
export default Ember.Controller.extend({
appName: 'Ember Twiddle',
messages: Ember.computed('model', function () {
return this.get('model').sortBy('created_at').reverse().uniqBy('user');
}),
});
如果您使用中间状态,也可以将计算属性链接在一起:
export default Ember.Controller.extend({
appName: 'Ember Twiddle',
sorting: ['created_at:desc'],
sortedModel: Ember.computed.sort('model', 'sorting'),
uniqModel: Ember.computed.uniqBy('sortedModel', 'user'),
});
您也可以在路线中进行此过滤:
// routes/application.js
export default Ember.Route.extend({
model() {
return messages.sortBy('created_at').reverse().uniqBy('user');
},
});
答案 1 :(得分:0)
我使用updated_at字段获取最近的评论。 将updated_at时间字符串更改为时间戳并选择时间戳最高的记录..
var data={
"messages": [
{
id: 1,
sender: 2,
receiver: 1,
body: "this is a first comment",
created_at: "2016-09-05 10:00:00",
updated_at: "2016-09-05 10:00:00",
user: 2
},
{
id: 2,
sender: 1,
receiver: 2,
body: "this is a second comment",
created_at: "2016-09-05 11:00:00",
updated_at: "2016-09-05 11:00:00",
user: 2
},
{
id: 3,
sender: 3,
receiver: 1,
body: "this is a first comment",
created_at: "2016-09-05 12:00:00",
updated_at: "2016-09-05 12:00:00",
user: 3
},
{
id: 4,
sender: 1,
receiver: 3,
body: "this is a second comment",
created_at: "2016-09-05 13:00:00",
updated_at: "2016-09-05 13:00:00",
user: 3
},
]
}
var latestMessage=data.messages[0];
data.messages.forEach(function(item){
if(new Date(item.updated_at).getTime()/1000 > new Date(latestMessage.updated_at).getTime()/1000){
latestMessage={};
latestMessage=item;
}
});
console.log(latestMessage);