批量

时间:2016-01-29 23:28:31

标签: javascript ember.js ember-data

我知道这个主题已经围绕stackoverflow和其他论坛进行了讨论,但我找不到正确的方法。

我有一个名为“post”的模型,其中包含帖子信息(用户,描述等)。用户收到一些帖子,读取它们并对它们进行操作。当我请求GET /api/posts/

时,帖子来自我的api

我还有一个名为“后置状态”的模型,我保存阅读帖子的人的动作:当他们喜欢,分享,投票或收藏帖子时。

export default DS.Model.extend({
    post: belongsTo('post'),
    user: belongsTo('user'),
    liked: attr('boolean', { defaultValue: false }),
    favourited: attr('boolean', { defaultValue: false }),
    voted: attr('boolean', { defaultValue: false }),
    shared: attr('boolean', { defaultValue: false }),
});

我正在寻找一种方法让我的ember应用程序大量保存我的后状态模型,就像我批量收到帖子一样。邮寄状态将通过api调用POST /api/post-states/

保存

我在讨论中读到最好的方法是创建一个自定义适配器,但我不知道该怎么做才能做到这一点...也许创建一个函数{{1 }}?

对我来说最好的解决方案是什么?

谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

我环顾四周,似乎没有正确的方法与Ember一起做这件事,但我想出了一些东西,我不知道它有多少Ember Way。您可以做的是创建一个包含hasMany属性的不同模型,该属性将包含您要批量保存的模型,然后将这些模型添加到容器模型中,您可以使用序列化器/适配器来获取你要。以下是它的工作原理:

模型(让我们称之为post-state-container

import DS from 'ember-data';

export default DS.Model.extend({
  postStates: DS.hasMany('post-state')
});

串行

import DS from 'ember-data';
import Ember from 'ember';

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    postStates: { embedded: 'always' },
  },
  serializeIntoHash: function(data, type, record, options) {
    Ember.$.extend(data, this.serialize(record, options));
  }
});

您可以在此处按下发送到服务器的有效负载,以满足您后端所需的内容,因为您将从post-state获得JSON格式的序列化this.serialize(record, options)对象列表

适配器

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  namespace: 'api',
  urlForCreateRecord: function() {
    return this.get('namespace') + '/post-states';
  },
});

如何使用它(可能在某处的路线或控制器中采取行动)

  let record1 = this.store.createRecord('post-state'); //These would be your populated records
  let record2 = this.store.createRecord('post-state'); //These would be your populated records
  let postStateContainer = this.store.createRecord('post-state-container');
  postStateContainer.get('post-state-container').pushObject(record1);
  postStateContainer.get('post-state-container').pushObject(record2);
  postStateContainer.save();

我已经测试了这个,它确实有效。我不确定是否有更好的方法使用JSONApi或类似的东西

答案 1 :(得分:1)

你可以看看ember-api-actions是如何做到的。查看包含执行ajax调用的方法的文件的build-urlone。您基本上可以复制方法并在模型中使用它。但我认为此时使用插件会更容易:)