2013-01-14 55 views
1

Here is a demo,如何在canJS中加載具有關聯的模型(在單個請求中)。 我發現它在github repo of canJShere,實際上我不得不重寫它有點工作(它已經過時了),但它現在起作用。canJS:使用關聯加載模型,但只保存「基本」模型

我的問題是,如果我更改加載的聯繫人(contact.attr('name', 'Tom');),然後我想保存它(contact.save();),那麼聯繫人以及聯繫人的任務將通過ajax發佈到服務器,保存。這是合乎邏輯的,因爲taskscontact的屬性。

我的問題是,我只想要聯繫name,birthdayid更新記錄時發佈。我可能應該覆蓋makeRequest方法,並在發佈到服務器之前刪除tasks,但我認爲應該有一個更優雅的解決方案。

希望這裏有一些canJS用戶,他們已經處理過這種情況。

回答

4

我正在尋找解決這一非常問題我自己,我想到了我自己一個人,通過trickey的上JavascriptMVC論壇建議在this post啓發有關修改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'] 
}, {}); 
+0

嘿kaptron。謝謝您的回答。這可能是一個可能的解決方法,實際上它是一個優雅的! :)謝謝你分享你的想法。 –