Here is a demo,如何在canJS中加载具有关联(在单个请求中)的模型。 我在github repo of canJS,here找到了它,实际上我不得不重写它(它已经过时了),但它现在有效。
我的问题是,如果我更改已加载的联系人(contact.attr('name', 'Tom');
),然后我想保存它(contact.save();
),那么联系人以及联系人的任务将通过ajax到服务器,要保存。这是合乎逻辑的,因为tasks
是contact
的属性。
我的问题是,我只希望在更新记录时发布联系人name
,birthday
和id
。我可能应该覆盖makeRequest
方法,并在发布到服务器之前删除tasks
,但我认为应该有一个更优雅的解决方案。
希望这里有一些canJS用户,他们已经处理过这种情况。
答案 0 :(得分:4)
我自己正在寻找这个问题的解决方案,我想出了自己的一个,受到trickey关于this post中JavascriptMVC论坛关于修改serialize()
模型方法的建议的启发它与Rails的效果更好。
与他的建议一样,我创建了自己的Model类扩展,并在模型中添加了include
字段,您可以在其中列出要包含的属性(在Rails as_json方法之后进行图案化)
can.Model("BaseModel", {}, {
serialize: function() {
var data, retval, serialized;
data = {};
retval = {};
serialized = can.Model.prototype.serialize.call(this);
//check if we're using the "include" fields or not
if (typeof this.constructor.include !== 'undefined') {
can.each(this.constructor.include, function(attr) {
data[attr] = serialized[attr];
});
} else {
data = serialized;
}
//wrap the return value in the model name for Rails purposes, e.g. {"event": {data}}
retval[this.constructor._shortName] = data;
return retval;
}
});
然后在我的模型中,我使用“include”数组来指示我想要包含哪些字段。通过省略“与会者”和“发言人”,这些关联的模型将不会打包到我发送回服务器的序列化JSON中。
Event = BaseModel.extend('Event', {
findAll: "GET /admin/events",
findOne: "GET /admin/events/{id}",
create: "POST /admin/events",
update: "PUT /admin/events/{id}",
destroy: "DELETE /admin/events/{id}",
attributes: {
attendees: 'Models.User.models',
speakers: 'Models.User.models'
},
include: ['id', 'name', 'start_time', 'end_time']
}, {});