我知道这个主题已经围绕stackoverflow和其他论坛进行了讨论,但我找不到正确的方法。
我有一个名为“post”的模型,其中包含帖子信息(用户,描述等)。用户收到一些帖子,读取它们并对它们进行操作。当我请求GET /api/posts/
我还有一个名为“后置状态”的模型,我保存阅读帖子的人的动作:当他们喜欢,分享,投票或收藏帖子时。
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 }}?
对我来说最好的解决方案是什么?
谢谢你的帮助!
答案 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-url和one。您基本上可以复制方法并在模型中使用它。但我认为此时使用插件会更容易:)