我正在使用播放列表对象,该对象具有一些属性以及PlaylistItem集合。
当我从服务器接收数据时,我在客户端成功方法中得到了JSON响应:
success: function (data) {
console.log("JSON data:", data);
playlists = _.map(data, function (playlistConfig) {
return new Playlist(playlistConfig);
});
...
}
在这里,我将我的JSON数据转换为播放列表对象。每个播放列表对象都是Backbone.Model。
以下是我的数据的外观:
以下是播放列表构造函数的样子:
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并将项添加到它,然后用新的数组替换旧的数组,但是好像真的好运。
答案 0 :(得分: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/ (您需要打开控制台才能看到该集合)
答案 1 :(得分: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));
}
});