2013-02-01 12 views
2

我有一個模型,看起來像:Backbone.Model保存 - 返回的模型的子元素不是Backbone.Collection。

var Playlist = Backbone.Model.extend({ 
    defaults: function() { 
     return { 
      id: null, 
      items: new PlaylistItems() 
     }; 
    } 
}); 

其中PlaylistItems是Backbone.Collection。

創建播放列表對象後,我調用save。

playlist.save({}, { 
    success: function(model, response, options) { 
     console.log("model:", model, response, options); 
    }, 
    error: function (error) { 
     console.error(error); 
    } 
}); 

在這裏,我的模型是一個Backbone.Model對象。但是,它的子項是Array類型,而不是Backbone.Collection。

這是意想不到的行爲。我錯過了什麼嗎?或者,我是否需要手動將我的數組傳遞到一個新的Backbone.Collection並自己初始化?

+0

骨幹默認情況下不支持保存/同步集合,所以可能發生的情況是,在模型返回之後,生成的JSON數組按原樣使用。集合旨在成爲「模型」(用於管理自己的持久性)的集合。如果PlaylistItems是聚合根的孩子,那麼你可能不應該使用Collection開始。 –

+1

我打電話給保存模型不在集合上。我不認爲有一個孩子在保存過程中收集模型負載是不合理的......你是說Backbone認爲那種不好的做法?如果是這樣,你知道爲什麼嗎?這看起來像一個普通的1到0+。 –

回答

4

它的種類取決於你的服務器期望什麼以及它的響應。骨幹不知道屬性items是一個骨幹集合,以及如何處理它。這樣的事情可能會起作用,這取決於您的服務器。

var Playlist = Backbone.Model.extend({ 
    defaults: function() { 
     return { 
      id: null, 
      items: new PlaylistItems() 
     }; 
    }, 
    toJSON: function(){ 
     // return the json your server is expecting. 
     var json = Backbone.Model.prototype.toJSON.call(this); 
     json.items = this.get('items').toJSON(); 
     return json; 
    }, 
    parse: function(data){ 
     // data comes from your server response 
     // so here you need to call something like: 
     this.get('items').reset(data.items); 
     // then remove items from data: 
     delete data.items; 
     return data; 
    } 

}); 
+0

在返回之前如何刪除data.items?修改data.items使其成爲Backbone.Collection不是更有意義嗎? –

+0

你從parse返回的對象在模型上獲取'set()',所以如果你創建了一個新的Collection並且返回它,模型會爲'items'創建一個新的collection實例。如果您已將「重置」事件或其他任何事件連接到以前的集合實例,則不再有效。用新的json調用'reset()'保持相同的實例,所以'重置'事件處理程序仍然會被擊中。 –

+0

會說data.items =新的PlaylistItems(data.items);然後返回數據達到相同的結果?或者有些不同?如果不同,你能解釋爲什麼嗎?我想我明白了,但我想確保... –

相關問題