我遇到了以下问题。
在我的应用程序中,我有一个屏幕来制作一个新的Site。但是,当我通过控制器上的action保存新站点时,languages-property不会随POST-request一起发送到服务器。
用于添加新站点的模板如下:
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="name">Name</label>
<div class="controls">
{{view Ember.TextField valueBinding="name"}}
</div>
</div>
<div class="control-group">
<label class="control-label" for="languages">Languages</label>
<div class="controls">
{{view Ember.Select contentBinding="controllers.languages" selectionBinding="languages" optionValuePath="content.id" optionLabelPath="content.description" multiple="true"}}
</div>
</div>
<div class="form-actions">
<button {{ action "createSite" }} class="btn btn-primary">Save</button>
</div>
我这样定义我的Store:
App.Store = DS.Store.extend({
revision : 12,
adapter : DS.RESTAdapter.extend({
namespace : 'rest'
})
});这是我的控制器:
App.SitesNewController = Em.ObjectController.extend({
needs: ['languages'],
name: null,
languages: null,
createSite : function() {
var self = this;
var name = this.get('name');
var languages = this.get('languages');
// Create the new Site model
var s = App.Site.createRecord({
name : name
});
$.each(languages,function(i,lang) {
s.get('languages').addObject(lang);
});
this.get('store').commit();
}
});这是Site-model
App.Site = DS.Model.extend({
name : DS.attr('string'),
languages : DS.hasMany('App.Language')
});Language-model:
App.Language = DS.Model.extend({
description : DS.attr('string')
});发送到我的服务器的POST-request数据如下:
{
"site":{"name":"test"}
}所以我很怀念language-property。实际上,我需要一个带有id数组的language_ids属性。
当我像这样编辑我的RESTAdapter-configuration时:
DS.RESTAdapter.map('App.Site', {
languages: { embedded: 'always' }
});现在,POST-request数据为:
{
"site": {
"name":"test",
"languages":[{
"id":2,"description":"English"
},{
"id":3,"description":"Deutsch"
}]
}
}语言已知嵌入在请求数据中。这是没有问题的,在后台,我会在保存之前得到id。但要知道它希望language-data也嵌入到GET-responses中。
在后期数据中只发送id的方法是什么?我希望是这样的:
{
"site": {
"name":"test",
"languages":[2,3]
}
}发布于 2013-03-30 03:17:02
这个答案很大程度上来自于this other StackOverflow answer。
App.Store = DS.Store.extend({
revision : 12,
adapter : DS.RESTAdapter.extend({
namespace : 'rest',
serializer: DS.RESTSerializer.extend({
addHasMany: function (hash, record, key, relationship) {
var type = record.constructor,
name = relationship.key,
serializedHasMany = [],
manyArray, embeddedType;
embeddedType = this.embeddedType(type, name);
if (embeddedType !== 'always') { return; }
manyArray = record.get(name);
manyArray.forEach(function (record) {
serializedHasMany.push(record.get('id'));
}, this);
hash[this.singularize(key) + '_ids'] = serializedHasMany;
}
})
})
});作为参考,您可以查看RESTSerializer主要继承自的JSONSerializer。可以在here中找到addHasMany所做的代码。
请注意,对于上面的代码片段,唯一不同的是最后几行。不是序列化嵌入的记录,而是将ids推送到单个键下的散列中(如果不是have its own check for embedded types,我就会使用RESTSerializer#keyForHasMany。
https://stackoverflow.com/questions/15683273
复制相似问题