2013-01-21 37 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%,但:) –