2014-04-22 30 views
0

我正在制作(学习!)backbone.Marionette应用程序。我的数据包含花,水果和鸟类阵列。我成功地追加了花和果实。但是,我正在接受每个水果下方鸟类的挑战。任何人都可以帮我解决这个问题?Backbone.Marionette - 如何在复合视图中追加第3个子视图?

的全部细节参观现场演示:

Live Demo

这里是我的HTML模板:

<script type="text/template" id="flower-template"> 
    <%= name %> 
</script> 
    <script type="text/template" id="garden-template"> 
     <div> <%= name %> </div> 
     <div id="garden"> 
      <ul></ul> 
     </div> 
    </script> 

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

在这里,你去为脚本:

var data = [ 
     { 
      "id": "1", 
      "name": "Rose", 
      "fruits": [ 
      { 
       "id": "100", 
       "name": "Banana", 
       "birds":[ 
        {"name":"parrot1"}, 
        {"name":"parrot2"} 
       ] 
      }, 
      { 
       "id": "101", 
       "name": "Gova", 
       "birds":[ 
        {"name":"eagle1"}, 
        {"name":"eagle2"} 
       ] 
      } 
      ] 
     }, 
     { 
      "id": "2", 
      "name": "Lilly", 
      "fruits": [ 
      { 
       "id": "200", 
       "name": "Mango", 
       "birds":[ 
         {"name":"dove1"}, 
         {"name":"dove2"} 
       ] 
      }, 
      { 
       "id": "201", 
       "name": "PineApple", 
       "birds":[ 
         {"name":"Bat1"}, 
         {"name":"Bat2"} 
       ] 
      } 
      ] 
     }, 
     { 
      "id": "3", 
      "name": "Lotus", 
      "fruits": [ 
      { 
       "id": "300", 
       "name": "Apple", 
       "birds":[ 
         {"name":"cooko1"}, 
         {"name":"cooko2"} 
       ] 
      }, 
      { 
       "id": "301", 
       "name": "Charry", 
       "birds":[ 
         {"name":"crow1"}, 
         {"name":"crow2"} 
       ] 
      } 
      ] 
     } 
] 

var gardenApp = new Backbone.Marionette.Application(); 

gardenApp.addRegions({ 
    mainRegion:'#content' 
}); 

gardenApp.birdModel = Backbone.Model.extend({}); 
gardenApp.birdCollection = Backbone.Collection.extend({ 
    model:gardenApp.birdModel, 
    initialize:function(){ 
     //console.log('flower collection initialized'); 
    } 
}); 

gardenApp.flowerModel = Backbone.Model.extend({}); 
gardenApp.flowerCollection = Backbone.Collection.extend({ 
    model:gardenApp.flowerModel, 
    initialize:function(){ 
     //console.log('flower collection initialized'); 
    } 
}); 

gardenApp.fruitModel = Backbone.Model.extend({}); 
gardenApp.fruitCollection = Backbone.Collection.extend({ 
    model:gardenApp.fruitModel, 
    initialize:function(){ 
     // console.log('fruit collection initialized'); 
    } 
}); 

gardenApp.birdView = Backbone.Marionette.ItemView.extend({ 
    tagName:"li", 
    template:"#bird-template" 
}); 


gardenApp.flowerView = Backbone.Marionette.ItemView.extend({ 
    tagName:"li", 
    template:"#flower-template" 
}); 

//how to add the bird under fruit? 

gardenApp.fruitView = Backbone.Marionette.CompositeView.extend({ 
    template:"#garden-template", 
    itemViewContainer:"ul", 
    itemView:gardenApp.flowerView, 
    initialize:function(){ 
     this.collection = this.model.get('fruits'); 
    } 

}); 

gardenApp.grandView = Backbone.Marionette.CollectionView.extend({ 
    itemView : gardenApp.fruitView, 
    initialize:function(){ 
     //console.log('initialized'); 
    } 
}); 


gardenApp.addInitializer(function(option){ 
    var datas = new gardenApp.flowerCollection(option.data); 

    datas.each(function(data, index){ 
     var fruits = data.get('fruits'); 
     var fruitCollection = new gardenApp.fruitCollection(fruits); 
     data.set('fruits', fruitCollection); 
    }); 

    var combainedView = new gardenApp.grandView({collection:datas}); 
    gardenApp.mainRegion.show(combainedView); 
}); 

gardenApp.start({data:data}); 

回答

1

你实际上是alr在正确的轨道上。你要做的唯一事情是使用CompositeView中的水果,而不是ItemView控件:

gardenApp.birdView = Backbone.Marionette.ItemView.extend({ 
    tagName:"li", 
    template:"#bird-template" 
}); 

gardenApp.flowerView = Backbone.Marionette.CompositeView.extend({ 
    template:"#flower-template", 
    itemViewContainer:"ul", 
    itemView:gardenApp.birdView, 
    initialize:function(){ 
     this.collection = this.model.get('birds'); 
    } 
}); 

从那里像你一样的水果,你可以定义集合为鸟类以同样的方式:

datas.each(function(data, index){ 
    var fruits = data.get('fruits'); 
    var fruitCollection = new gardenApp.fruitCollection(fruits); 
    data.set('fruits', fruitCollection); 

    // Add birds 
    fruitCollection.each(function(data, index){ 
     var birds = data.get('birds'); 
     var birdCollection = new gardenApp.birdCollection(birds); 
     data.set('birds', birdCollection); 
    });   
}); 

当然对花的模板应该是:

<script type="text/template" id="flower-template"> 
    <div> <%= name %> </div> 
    <div id="flower"> 
     <ul></ul> 
    </div> 
</script> 

在这里看到一个工作版本:http://jsfiddle.net/Cardiff/ngr9N/

相关问题