Я пытаюсь сделать раздел событий в приложении Marionette. Я принял подход к объединению составного представления, содержащего мой CollectionView.
Я думаю, что CompositeView отобразит CollectionView, а затем CollectionView отобразит мой список ItemViews (событий).
В настоящее время CompositeView отображает CollectionView, но элементы ItemViews не создаются или не отображаются.
Это мое первое приложение Marrionette. Я использую узел для dep. управление. Gulp для создания, браузера и babel. Я следил за этим проектом, чтобы получить все, что происходит до сих пор: 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);
}
});
Event-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>
Добавляем к комментарию, который @J. Titus сделал, вы спросили, как подождать, пока все ItemViews CollectionView будут отображены, вы можете использовать это:
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;
}
});
Надеюсь, это решит вашу проблему.
Как @J. Титус уже прокомментировал, вы можете использовать либо CompositeView, либо CollectionView.
Я бы рекомендовал использовать CollectionView
так как вам нужен только регион для отображения представлений модели списка.
Дело в вашей коллекции заключается в том, что вы никогда не заполняете ее в своем коде. Когда вы создаете новую коллекцию, она пуста, если вы специально не передадите массив моделей. Поэтому вам нужно вызвать .fetch()
или .reset()
(я рекомендую последний для использования в первый раз и для получения сразу нескольких моделей).
Так как в вашем collectionEvents
вы захватываете все события и визуализируете их, представление должно обновляться, когда модели загружены.