1

我想呈现我的Marionette应用程序中的事件部分。我已经采用了包含我的CollectionView的复合视图的方法。Backbone Marionette - 如何渲染CompositeView-> CollectionView-> ItemView

我在想,CompositeView将呈现CollectionView,然后CollectionView将呈现我的ItemViews(事件)列表。

目前,CompositeView呈现CollectionView,但没有ItemView被实例化或呈现。

这是我第一次Marrionette应用程序。我正在使用节点作为dep。管理。咕咕地建立,浏览,和巴贝尔。我跟着这个项目,让一切都变得如此遥远:https://github.com/thejameskyle/marionette-wires

非常感谢您的帮助!谢谢!

CompositeView中

import { 
    CompositeView 
} from 'backbone.marionette'; 
import { 
    CollectionView 
} from 'backbone.marionette'; 
import { 
    Collection 
} from 'backbone'; 
import template from './events-template.hbs'; 
import EventsService from '../services/events-service'; 
import EventsView from './events-view'; 
import EventModel from '../models/events-model'; 
import EventsCollection from '../collections/events-collection'; 
export default CompositeView.extend({ 
    template: template, 
    className: 'col-md-3 calendar', 
    childViewContainer: "ul", 
    model:EventModel, 



    regions: { 
    events: '.events-list', 
    }, 
    initialize: function(){ 
    let self = this; 
    EventsService.find().then(collection => { 
     self.collection = collection; 
     console.log('Events CompositeView '+self.collection); 
     self.childView = new EventsView({collection:self.collection}); 
    }); 
    }, 

    setup(options = {}) { 
    this.container = options.container; 
    console.log("setup"); 
    }, 

    modelsChanged() { 
    console.log('Events ModelChanged' + this.model); 
    } 
}); 

活动,Template.hbs

<section class="panel"> 
    <div class="panel-body"> 
    <div class="monthly-stats pink"> 
     <div class="clearfix"> 
     <h4 class="pull-left">Calendar</h4> 
     <!-- Nav tabs --> 
     <div class="btn-group pull-right stat-tab"> 
      <a href="#line-chart" class="btn stat-btn active" data-toggle="tab">Week</a> 
      <a href="#bar-chart" class="btn stat-btn" data-toggle="tab">Month</a> 
     </div> 
     </div> 
    </div> 
    <div class="events-list"> 

    </div> 
    </div> 
</section> 

的CollectionView

import { 
    CollectionView 
} from 'backbone.marionette'; 
import { 
    Collection 
} from 'backbone'; 
import EventView from './event-view'; 
export default CollectionView.extend({ 
    tagName: 'ul', 
    childView: EventView, 
    childViewContainer: '.events-list', 

    getChildView: function(item) { 
    console.log('ChildView' +item); 
    }, 

    initialize: function() { 
    console.log('EVENTs CollectionView '+this.collection); 
    for(let val of this.collection.models) { 
     console.log(val.attributes); 
    } 
    }, 
    onBeforeRender: function() { 
    console.log('Before EVENT CollectionView '+this.collection); 
    }, 
    collectionEvents: { 
    all: 'render' 
    }, 
    childEvents: { 
    // This callback will be called whenever a child is rendered or emits a `render` event 
    render: function() { 
     console.log('A child view has been rendered.'); 
    } 
    } 
}); 

ItemView //所有登录itemView只是看看是否有任何东西被调用。它不是。

import { 
    ItemView 
} from 'backbone.marionette'; 
import { 
    Collection 
} from 'backbone'; 
import template from './event-template.hbs'; 


export default ItemView.extend({ 
    template: template, 
    tagName:'div', 
    className: 'col-md-3', 
    attributes() { 

    }, 
    onShow: function() { 
     console.log('Single EVENT'); 
    }, 
    initialize: function(o) { 
    console.log('init itemView'); 
    }, 
    show() { 
    console.log("ITEM"); 
    }, 
    modelEvents: { 
    all: 'render' 
    }, 
    onBeforeRender() { 
    console.log("EVENZT VIEW"); 
    }, 
    render() { 
    console.log("EVENZT VIEW"); 

    }, 
    modelsChanged() { 
    console.log('Events ModelChanged' + this.model); 

    } 
}); 

事件Template.hbs

<div class="alert alert-info clearfix"> 
     <span class="alert-icon"><i class="fa fa-envelope-o"></i></span> 
     <div class="notification-info"> 
     <ul class="clearfix notification-meta"> 
      <li class="pull-left notification-sender"><span><a href="#">{{eventName}}</a></span></li> 
     </ul> 
     <p> 
      <span>{{program}}</span><span> 
     </p> 
     </div> 
    </div> 
+0

'CompositeView'是'CollectionView'的扩展 - 你不需要两者。只需将您的集合与必要的选项(如“childView”和“childViewOptions”)一起传递到“CompositeView”中。 –

+0

谢谢!现在,等待呈现项目视图直到CollectionView集合被填充。 – user1026498

回答

0

由于@J。 Titus已经评论过,您可以使用CompositeView或CollectionView。

我推荐使用CollectionView,因为您只需要区域来显示列表模型视图。

关于你的收藏的事情是你永远不会在你的代码中填充它。当你创建一个新的集合时,除非你专门传递了一个模型数组,否则它是空的。所以你需要拨打.fetch().reset()(我建议后者首次使用,并一次获得很多模型)。

由于在您的collectionEvents中,您正在捕获所有事件并对其进行渲染,视图在模型加载完成时应该自行更新。

3

添加到评论哪个@J。提多发,你问如何等到的CollectionView的所有ItemViews呈现,您可以使用此:

var ItemView = Backbone.Marionette.ItemView.extend({ 
    onShow: function() { 
     this.trigger('childOnShow'); 
    } 
}); 

var View = Backbone.Marionette.CollectionView.extend({ 
    childView: ItemView, 
    childEvents: { 
     'childOnShow': 'onChildShowHandler' 
    }, 
    onChildShowHandler: function() { 
     this.count++; 
     if (this.count === this.collection.length) { 
      // call your function here 
     } 
    }, 
    onShow: function() { 
     this.count = 0; 
    } 
}); 

希望这将解决您的问题。