I'm building my first real web app using backbone and I'm struggling with nested resources.
This is a simplified version of the json response i'm working with:
{
  "id": 1,
  "title": "Test Survey",
  "groups": [
    {
      "id": 1,
      "title": "Basic Questions",
      "questions": [
        {
          "id": 1,
          "title": "Which is your favorite color?"
        },
        {
          "id": 2,
          "title": "Do you have any other hobbies?"
        }
      ]
    },
    {
      "id": 2,
      "title": "Working Questions",
      "questions": [
        {
          "id": 3,
          "title": "Do you think working exp is very important?"
        }
      ]
    }
  ]
}
Basically theres a Survey object which has many Groups, each Group has many Questions.
I can't seem to figure out a good way to get all this data into models/ collections.
What I currently have is:
// Models
var Question = Backbone.Model.extend({});
var Group    = Backbone.Model.extend({});
var Survey   = Backbone.Model.extend({ url: surveyURL });
// Collections
var GroupsCollection    = Backbone.Collection.extend({});
var QuestionsCollection = Backbone.Collection.extend({});
//Views
var SurveyView = Backbone.View.extend({
  ..
});
var GroupsCollectionView = Backbone.View.extend({
  ..
});
var QuestionsCollectionView = Backbone.View.extent({
  ..
});
var survey = new Survey({ groups: new GroupsCollection({model: Group}) });   
var groupsView  = new GroupsCollectionView({collection: survey.get('groups')});
This seems to work for nesting Groups in the Survey model, but how do I store the questions in a collection and then assign that to each model in the Groups collection?
As mentioned I'm relatively new to backbone, so if I'm going down the completely wrong path or there's a better way to do this please let me know.
Cheers.
I usually declare my sub collections as properties of my objects (I remove them from the attributes hash : in your example, that means referencing survey.groups instead of survey.get('groups')) and use model.parse to populate them.
With your Survey model :
var GroupsCollection = Backbone.Collection.extend({
    model: Group
});
var Survey = Backbone.Model.extend({
    initialize: function(data) {
        this.groups = new GroupsCollection();
        this.parse(data);
    },
    parse: function(data) {
        if (data.groups) {
            this.groups.reset(data.groups);
        }
        return _.omit(data, 'groups');
    }
});
Your Group class would be declared in a similar fashion. You would pass your data to the constructor:
var s = new Survey({
    "id": 1,
    "title": "Test Survey",
    "groups": [],
    ...
});
var g = s.groups.at(0); //first group
var q = g.questions.at(0); //first question in the first group
Your data is then traversed to build the whole hierarchy.
And a demo http://jsfiddle.net/nikoshr/947Vf/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With