gpt4 book ai didi

ember.js - 将外键保存到具有 hasMany 关系的其他模型

转载 作者:行者123 更新时间:2023-12-02 19:12:34 26 4
gpt4 key购买 nike

我遇到以下问题。

在我的应用程序中,我有一个屏幕可以创建新的站点。但是,当我通过 Controller 上的 action 保存新站点时,languages 属性不会随 POST 请求一起发送到服务器。

添加新站点的模板是这样的:

<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'
})
});

这是我的 Controller :

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();
}
});

这是站点-模型

App.Site = DS.Model.extend({
name : DS.attr('string'),
languages : DS.hasMany('App.Language')
});

语言-模型:

App.Language = DS.Model.extend({
description : DS.attr('string')
});

发送到我的服务器的POST请求数据是这样的:

{
"site":{"name":"test"}
}

所以我想念语言属性。实际上,我期望一个包含 id 数组的 language_ids 属性。

当我像这样编辑我的 RESTAdapter 配置时:

DS.RESTAdapter.map('App.Site', {
languages: { embedded: 'always' }
});

现在 POST 请求数据是:

{
"site": {
"name":"test",
"languages":[{
"id":2,"description":"English"
},{
"id":3,"description":"Deutsch"
}]
}
}

已知这些语言嵌入在请求数据中。这没问题,在后端我会在保存之前获取id。但要知道它也希望将语言数据嵌入到 GET 响应中。

仅发送 POST 数据中的 id 的方法是什么?我希望它是这样的:

{
"site": {
"name":"test",
"languages":[2,3]
}
}

最佳答案

这个答案很大程度上来自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;
}

})

})
});

作为引用,您可以查看 JSONSerializerRESTSerializer 主要继承自它。可以找到 addHasMany 的代码 here .

请注意,对于上面的代码片段,唯一真正不同的行是最后几行。 id 不是序列化嵌入记录,而是被推送到单数键下的哈希(如果没有 have its own check for embedded types,我会使用 RESTSerializer#keyForHasMany

关于ember.js - 将外键保存到具有 hasMany 关系的其他模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15683273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com