Backbone.Marionette - Collection within CompositeView, which itself is nested in a CollectionView

Posted by nicefinly on Stack Overflow See other posts from Stack Overflow or by nicefinly
Published on 2012-11-29T20:04:13Z Indexed on 2012/11/29 23:05 UTC
Read the original article Hit count: 478

*UPDATE: The problem probably involves the tour-template as I've discovered that it thinks the 'name' attribute is undefined. This leads me to think that it's not an array being passed on to the ToursView, but for some reason a string. *

After studying similar questions on StackOverflow:

How to handle nested CompositeView using Backbone.Marionette?

How do you properly display a Backbone marionette collection view based on a model javascript array property?

Nested collections with Backbone.Marionette

... and Derick Bailey's excellent blog's on this subject:

http://lostechies.com/derickbailey/2012/04/05/composite-views-tree-structures-tables-and-more/

... including the JSFiddle's:

http://jsfiddle.net/derickbailey/AdWjU/

I'm still having trouble with a displaying the last node of a nested CollectionView of CompositeViews. It is the final CollectionView within each CompositeView that is causing the problem.

CollectionView {
    CompositeView{
        CollectionView {} //**<-- This is the troublemaker!**
        }
    }

NOTE: I have already made a point of creating a valid Backbone.Collection given that the collection passed on to the final, child CollectionView is just a simple array.

Data returned from the api to ToursList:

[
{   "id": "1", 
    "name": "Venice", 
    "theTours": "[
        {'name': u'test venice'}, 
        {'name': u'test venice 2'}
    ]"
}, 

{   "id": "2", 
    "name": "Rome",
    "theTours": "[
        {'name': u'Test rome'}
    ]"
}, 
{   "id": "3", 
    "name": "Dublin", 
    "theTours": "[
        {'name': u'test dublin'}, 
        {'name': u'test dublin 2'}
    ]"
}
]

I'm trying to nest these in a dropdown where the nav header is the 'name' (i.e. Dublin), and the subsequent li 's are the individual tour names (i.e. 'test dublin', 'test dublin2', etc.)

Tour Models and Collections

ToursByLoc = TastypieModel.extend({});

ToursList = TastypieCollection.extend({
  model: ToursByLoc,
  url:'/api/v1/location/',
});

Tour Views

ToursView = Backbone.Marionette.ItemView.extend({
  template: '#tour-template',
  tagName: 'li',  
});

ToursByLocView = Backbone.Marionette.CompositeView.extend({

  template: '#toursByLoc-template',
  itemView: ToursView,

  initialize: function(){

    //As per Derick Bailey's comments regarding the need to pass on a
    //valid Backbone.Collection to the child CollectionView
    //REFERENCE: http://stackoverflow.com/questions/12163118/nested-collections-with-backbone-marionette

    var theTours = this.model.get('theTours');
    this.collection = new Backbone.Collection(theTours);
  },

  appendHtml: function(collectionView, itemView){
    collectionView.$('div').append(itemView.el);
  }
});

ToursListView = Backbone.Marionette.CollectionView.extend({
  itemView: ToursByLocView,
});

Templates

  <script id="tour-template" type="text/template">
    <%= name %>
  </script>

  <script id="toursByLoc-template" type="text/template">
    <li class="nav-header"><%= name %></li>
    <div class="indTours"></div>
    <li class="divider"></li>
  </script>

© Stack Overflow or respective owner

Related posts about backbone.js

Related posts about backbone.marionette