Ember.js - 过滤消息

时间:2016-09-26 08:29:08

标签: javascript ember.js ember-data

我在/ 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来帮助说明这一点。

我正在调查mapByuniq方法,并且没有成功地使用它们。

非常感谢任何指示或建议。

2 个答案:

答案 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);