1

这是一个演示,如何在 canJS 中加载具有关联的模型(在单个请求中)。我在canJS 的 github repo 中找到了它,here,实际上我不得不稍微重写它才能工作(它已经过时了),但它现在可以工作了。

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

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

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

4

1 回答 1

4

我自己正在寻找解决这个问题的方法,我想出了我自己的解决方案,灵感来自于trickey 在这篇文章中的 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;
  }
});

然后在我的模型中,我使用“包含”数组来指示我想要包含哪些字段。通过省略“参加者”和“演讲者”,这些关联的模型将不会被打包到我的序列化 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']
}, {});
于 2013-02-12T11:19:36.843 回答