2011-09-28 44 views
0

我有一個軌道控制器,它將模型的mash-up作爲全局json對象發送。像這樣的東西主幹與Rails中的混搭模型同步

{ 
    dogs : { species: {}, ...}, 
    cats : { food: {}, ...}, 
    foxes : { }, 
    ..., 
    ... 
} 

在我的客戶端,我將所有這些實體整齊地分隔到不同的主幹模型和主幹集合中。

在某些onchange事件中,我需要將某些模型屬性的mashup作爲HTTP POST請求發送回服務器,並且服務器發送的響應再次跨越幾個模型跨越值。

如何設置Backbone.sync來處理這種ajax場景?我不想更換導軌後端,因爲它的實施非常穩定。或者我通過jQuery在我的一個骨幹視圖中創建了vanilla $ .ajax請求,並在ajax成功/失敗的回調中處理它?

回答

2

我認爲有幾種方法可以通過骨幹來實現。我想我會先有自己的模型來表示混搭:

var MashupModel = Backbone.Model.extend({ 
}); 

然後你就可以在任何車型均經過像你通常會(或爲此事的集合):

var my_mash = new MashupModel({ 
    dog: dogModel.toJSON(), 
    cat: catModel.toJSON(), 
    foxes: foxCollection.toJSON() 
}); 
// do stuff if you need... 

然後做你想做的,當響應返回正常人一樣:

my_mash.save({}, { 
    success: function(model, response) { 
    // do stuff here to put new data into the proper models/collections 
    }, 
    error: function() { alert("I FAIL!"); } 
}); 

這一切都很好。不過,我認爲這將是更好的下推到上述的MashupModel對象,而不是在請求文件VEL。此外,幾種方法:

var MashupModel = Backbone.Model.extend({ 
    initialize: function(attrs) { 
    // can't remember the actual code, but something along the lines of: 
    _.each(attrs.keys, function(key) { 
     this.set(key, attrs.key.toJSON(); 
    }); 
    }, 

    save: function(attrs, opts) { 
    var callback = opts.success; 
    opts.success = function(model, response) { 
     // do your conversion from json data to models/collections 
     callback(model, response); 
    }; 
    // now call 'super' 
    // (ala: http://documentcloud.github.com/backbone/#Model-extend) 
    Backbone.Model.prototype.set.call(this, attrs, opts); 
    } 
}); 

或者你可以覆蓋的toJSON(因爲骨幹調用,以獲得ATTRS準備AJAX):

// class definition like above, no initilize... 
... 
toJSON: function() { 
    // again, this is pseudocode-y 
    var attrs = {}; 
    _.each(this.attributes.keys, function() { 
    attrs.key = this.attributes.key.toJSON(); 
    }); 
    return attrs; 
} 
... 
// save: would be the same as above, cept you'd be updating the models 
// directly through this.get('dogs').whatever... 

現在,你可以這樣做:

var my_mash = new MashupModel({ 
    dog: dogModel, 
    cat: catModel, 
    foxes: foxCollection 
}); 
// do some stuff... 

my_mash.save({}, { 
    success: function(model, response) { 
    // now only do stuff specific to this save action, like update some views... 
    }, 
    error: function() { alert("I FAIL!"); } 
+0

非常有趣。我很想創建一個像MashupModel這樣的抽象骨幹模型,但在此之前就對社區進行了調查。我想我會試一試,然後報告實驗的進展情況,然後可能接受你的答案。再次感謝! – papdel

0

這是可能的,但可能很難修改backbone.sync以使用此結構。我建議使用普通的舊jQuery $ .ajax請求。那麼在成功之後,將信息分開並填充您的集合。

$.get("/whatever", function(data){ 
    catCollection.reset(data.cats); 
    dogCollection.reset(data.dogs); 
    // etc 
}); 


data = {}; 
data.cats = catCollection.toJSON(); 
data.dogs = dogCollection.toJSON(); 
// etc 
$.post("/whatever", data);