canJS:使用关联加载模型,但只保存“基础”模型

时间:2013-01-14 10:42:59

标签: javascript jquery canjs canjs-model

Here is a demo,如何在canJS中加载具有关联(在单个请求中)的模型。 我在github repo of canJShere找到了它,实际上我不得不重写它(它已经过时了),但它现在有效。

我的问题是,如果我更改已加载的联系人(contact.attr('name', 'Tom');),然后我想保存它(contact.save();),那么联系人以及联系人的任务将通过ajax到服务器,要保存。这是合乎逻辑的,因为taskscontact的属性。

我的问题是,我只希望在更新记录时发布联系人namebirthdayid。我可能应该覆盖makeRequest方法,并在发布到服务器之前删除tasks,但我认为应该有一个更优雅的解决方案。

希望这里有一些canJS用户,他们已经处理过这种情况。

1 个答案:

答案 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']
}, {});