Como definir profundamente .reset () coleções de backbone

Se você já teve que lidar com uma ontologia de front-end que envolve grande profundidade, à la Playlists> Playlist> Tracks> Track , e tudo que você quer chamar é Playlists.reset( /* JSON received from server */ ), e você está usando RequireJS, aqui está o que você faz:

Playlists:

define([
'jquery'
, 'underscore'
, 'backbone'
, '../models/playlist'
], function($, _, Backbone, Playlist){

var playlists = Backbone.Collection.extend({

model
: Playlist

});

return new playlists;

});

Lista de reprodução

Essa é a parte importante! Quando este modelo for construído, seus atributos serão definidos antes de sua função de inicialização ser chamada, portanto, redefinimos sua coleção filho nesse momento:

define([
'jquery'
, 'underscore'
, 'backbone'
, '../collections/tracks'
], function($, _, Backbone, Tracks){

return Backbone.Model.extend({

// Add this initialize func to reset this
// model's child collection.
initialize
: function(){
var tracks = new Tracks;
this.set('tracks', tracks.reset(this.get('tracks')));
}

});

});

É uma descida daqui …

Trilhas:

define([
'jquery'
, 'underscore'
, 'backbone'
, '../models/track'
], function($, _, Backbone, Track){

return Backbone.Collection.extend({
model
: Track
});

});

Track:

define([
'jquery'
, 'underscore'
, 'backbone'
], function($, _, Backbone){

return Backbone.Model.extend({

});

});

Et voilà! Se você quisesse acessar uma faixa específica, faria o seguinte:

Playlists.get('playlist').get('tracks').get('track');

A moral da história é esta: se você está redefinindo uma coleção cujos modelos podem ter coleções, esses modelos precisam redefinir suas coleções com o JSON que receberam para aquele atributo. Em teoria, você poderia fazer isso ad infinitum.