2013-01-21 134 views
3

我正在使用具有一些定義自身以及PlaylistItem集合的屬性的播放列表對象。將JSON數據轉換爲具有子集合的Backbone模型

當我收到從我的服務器的數據,我得到了我的客戶端的成功方法,它的JSON響應:

success: function (data) { 
    console.log("JSON data:", data); 

    playlists = _.map(data, function (playlistConfig) { 
     return new Playlist(playlistConfig); 
    }); 

    ... 
} 

在這裏,我在我的JSON數據轉換成播放列表對象。每個播放列表對象都是一個Backbone.Model。

這裏是我的數據的外觀:

enter image description here

而這裏的播放列表構造的樣子:

return function(config) { 
    var playlist = new Playlist(config); 

    return playlist; 
}; 

var Playlist = Backbone.Model.extend({ 
    defaults: function() { 
     return { 
      id: null, 
      userId: null, 
      title: 'New Playlist', 
      selected: false, 
      position: 0, 
      shuffledItems: [], 
      history: [], 
      items: Backbone.Collection.extend({ 
       model: PlaylistItem 
      }) 
     }; 
    }, 
    ... 
} 

我的問題:

如果我創建默認播放列表對象,它爲PlaylistItem初始化一個空的Backbone.Collection。但是,如果我使用已定義的集合創建播放列表對象,則會獲得基本數組而不是Backbone.Collection。這是因爲我正在處理尚未轉換爲Backbone實體的服務器的JSON數據。該數據通過播放列表的默認值進行擴展並覆蓋Backbone.Collection實體。

什麼是用填充的Backbone.Collection進行初始化的正確方法?我可以在Initializes中編寫代碼,它檢查我的items數組的類型,如果它不是Backbone.Collection,我可以創建一個新的Backbone.Collection並添加項目,然後用新項目替換舊數組,但是看起來真的很嗨。

+1

見我回答這個問題的一種模式,模型中的管理集合屬性:http://stackoverflow.com/questions/14315302/backbone-can-an-attribute-contain-a-collection/14315827#14315827 – jevakallio

回答

1

不要在默認情況下但事先定義您的PlalistItems集合。這裏

var PlaylistItems = Backbone.Collection.extend({ 
    ... 
}); 

var Playlist = Backbone.Model.extend({ 
    initialize: function() { 
     this.set('items', new PlaylistItems(this.items)); 
    }, 

    defaults: function() { 
     return { 
      id: null, 
      userId: null, 
      title: 'New Playlist', 
      selected: false, 
      position: 0, 
      shuffledItems: [], 
      history: [], 
      items: [] // don't define your PlaylistItems Collection here 
     }; 
} 
}); 

退房小提琴: 然後,在你的播放列表模式創建一個初始化方法,像這樣http://jsfiddle.net/georgedyer/r2XKb/ (你需要打開控制檯看到集合)

0

另一個問題我當你將你的模型保存到服務器後,你會得到一個響應,將你的嵌入式集合變成一個常規的JavaScript數組。爲了解決這個問題,我不得不重寫解析功能,對我的模型類,像這樣:

var model = backbone.Model.extend({ 
     urlRoot : "/rest/model", 

     initialize: function(){ 
      this.set("myCollection", new MyCollection(this.myArray)); 
     }, 

     defaults: { 
      myArray: [] 
     }, 

     parse: function(response){ 
      this.set(response); 
      this.set("myArray", new MyCollection(response.myArray)); 
     } 
    }); 
+0

嘿,只是供參考我認爲最好的做法是始終從解析中返回並顯示通過返回所做的工作。就像:https://gist.github.com/MeoMix/6ee36e30ea0e9c140ee3 - 這是我目前使用的。這不是100%,但:) –