2013-01-14 64 views
4

骨幹在作者和書籍之間存儲關係(在本地存儲中)的期望方式是什麼。骨幹可以一個屬性包含一個集合?

是否有可能有一個集合作爲屬性或應該使用一個數組或...?

var book = Backbone.Model.extend({ 
    defaults:{ 
     title: '' 
    } 
}); 

var books = Backbone.Collection.extend({ 
    model: book 
}); 


var author = Backbone.Model.extend({ 
     defaults:{ 
     firstName: '', 
     lastName: '', 
     books: new books() 
     } 
}); 

var authors = Backbone.Collection.extend({ 
    model: author, 
    localStorage: new Backbone.LocalStorage("authors") 
}); 

回答

8

在Backbone中沒有一種處理嵌套集合的真正方法。從Backbone FAQ報價:

骨幹不包括嵌套模型和收藏或直接支持「有很多個」協會,因爲有許多很好的模式爲客戶端上的造型結構化數據和骨幹應提供實施它們的基礎。

的常見問題也表明一個模式,並提供了一個鏈接到Extensions, Plugins, Resources頁面,它鏈接到您可以使用處理嵌套的模型和模型關係許多圖書館。

這就是說,我有時走近這樣的問題:

var Author = Backbone.Model.extend({ 

    initialize: function(attrs, options) { 
    //convert the child array into a collection, even if parse was not called 
    var books = attrs ? attrs.books : []; 
    if(!(books instanceof Books)) { 
     this.set('books', new Books(books), {silent:true}); 
    } 
    }, 

    //the books property does not need to be declared in the defaults 
    //because the initialize method will create it if not passed 
    defaults: { 
    firstName: '', 
    lastName: ''  
    }, 

    //override parse so server-sent JSON is automatically 
    //parsed from books array to Books collection 
    parse: function(attrs) { 
    attrs.books = new Books(attrs.books); 
    return attrs; 
    }, 

    //override toJSON so the Books collection is automatically 
    //converted to an array 
    toJSON: function() { 
    var json = Backbone.Model.prototype.toJSON.call(this); 
    if(json.books instanceof Books) { 
     json.books = json.books.toJSON(); 
    } 
    return json; 
    } 
}); 

的意見希望解釋它是如何工作的,但問題是,你可以使用該模型,你通常會:初始化與孩子一個集合,一個數組或任何東西,從服務器獲取,將它們發送到服務器,它們都應該透明地工作。有很多樣板代碼需要編寫,但如果您發現自己重複使用相同的代碼,那麼將其抽象爲基類相對簡單。

編輯:小幅盤整,你不需要在defaults對象定義的books,因爲構造函數,如果缺失創建它。

/代碼示例未測試

+0

謝謝我將再次看看FAQ。 –