2012-06-20 109 views
6

我看到在Backbone中有深度模型可用的技術,但單個模型的層次集合又如何?我們如何在Backbone.js中表示深層模型層次結構

一個明顯的例子是一個類別樹。所以,我們可以有一個類別模型,它有幾個屬性,'名稱','類型','顏色'等等。

我們使用js,而不是使用關係數據庫樣式的父ID,所以我們希望將數據表示爲json。

是否可以利用骨幹來支持(可能通過擴充集合)包含樹中單個模型實例的數據結構(使模型和子模型都是同一模型的實例)?

回答

8

看一看Backbone-Relationalsupermodel.js

這些項目提供了比默認實現更好的模型嵌套形式。

我們只是窩骨幹車型,如:

var MyModel = Backbone.Model.extend({}); 
var MySubModel = Backbone.Model.extend({}); 

var model = new MyModel({submodel: new MySubModel({color: 'blue'})}); 

而且我們覆蓋了toJSON方法:

// nested models! Might just override the internal representation of this... 
_.extend(Backbone.Model.prototype, { 
    // Version of toJSON that traverses nested models 
    toJSON: function() { 
    var obj = _.clone(this.attributes); 
    _.each(_.keys(obj), function(key) { 
     if(!_.isUndefined(obj[key]) && !_.isNull(obj[key]) && _.isFunction(obj[key].toJSON)) { 
     obj[key] = obj[key].toJSON(); 
     } 
    }); 
    return obj; 
    } 
}); 

_.extend(Backbone.Collection.prototype, { 
    // Version of toJSON that traverses nested models 
    toJSON: function() { 
    return this.map(function(model){ return model.toJSON(); }); 
    } 
}); 

所以JSON表示看起來是正確的,我們鳥巢模型時。您必須注意模型上的parse方法,但是當您從服務器取回JSON時,您必須生成所有子模型和集合,以便它們都能正常工作。

+0

是的,那第一個'toJSON'方法可能會寫得更好'if(key instanceof Backbone.Model)'或某種程度上...... – tkone

+2

謝謝..如果我們檢索整個樹爲json從一個請求中的服務器..我們如何去一步去實例化它? – hacklikecrack