如何使用Ember-Data和Ember在本地更新记录?

时间:2015-04-24 09:41:09

标签: ember.js ember-data

我正在构建基于聊天的应用程序,该应用程序允许用户查看邮件历史记录,发送新邮件以及从最近的用户中进行选择。最近的用户列表按recent_rating属性排序,该属性是与该用户相关的最后发送/接收消息的日期。 recent_rating不是数据库中的属性,而是在用户模型中声明的方法。我第一次加载页面时正在正确订购用户,并在我的代码中进行以下设置:

串行:

class UserSerializer < ActiveModel::Serializer
    attributes :id, :email, :name, :recent_rating
end

Rails模型:

    def recent_rating
        Message.where('recipient_id = :user_id OR sender_id = :user_id', user_id: id).last.try(:created_at)
    end

Ember控制器:

App.ChatsController = Ember.ArrayController.extend(
{
    sortProperties: ['recent_rating'],
    sortAscending: false,

    ....
});

Ember模特:

App.User = DS.Model.extend(
{
  name: DS.attr('string'),
  email: DS.attr('string'),
  recent_rating: DS.attr('string'),
});

但是,当我发送新消息时,我需要更新本地ember-data存储中的recent_rating属性以获取相关用户记录。这将反过来更新最近用户的列表排序。

如何更新Ember-Data中的记录属性并避免API POST请求?由于recent_rating在API端的数据库中不作为属性存在

由于

1 个答案:

答案 0 :(得分:0)

有一种技术方法可以满足您的需求(store#push),但我认为这里的设计有点偏差。

以下是我对此进行建模的方法。 user有多个messagesmessagecreatedAt属性。然后按最新消息对用户进行排序就成了一些简单的计算属性:

App.Message = DS.Model.extend({
  user: DS.belongsTo('user'),
  createdAt: DS.attr('date')
});

App.User = DS.Model.extend({
  messages: DS.hasMany('message'),
  name: DS.attr('string'),
  email: DS.attr('string'),

  messagesSorting: ['createdAt:desc']
  orderedMessages: Ember.computed.sort('messages', 'messagesSorting'),
  latestMessage: Ember.computed.alias('orderedMessages.firstObject')
});

现在在您的控制器/组件中(无论显示哪些用户),您可以创建一个新的计算属性来对用户进行排序:

App.SomeController = Ember.Controller.extend({
  usersSorting: ['latestMessage:desc'],
  sortedUsers: Ember.computed.sort('model', 'usersSorting')
});

并在模板中使用该属性。

P.S。如果可能,你应该开始使用Ember CLI:)