Marionette Collection View, получение коллекции не запускает события

У меня проблема: мой CollectionView не отображает мой ItemViews. Я передаю коллекцию из макета в представление коллекции. Я получаю коллекцию в CollectionView:

В макете:

    // Create a a collection for the view
    this.articles = new Articles(null, {
        organizationId : this.model.organizationId,
        projectId : this.model.id
    });

    var articlesView = new ArticleCollectionView({ collection : this.articles});
    this.articlesRegion.show(articlesView);

В представлении коллекции:

define([
    'marionette',
    'templates',
    'i18n!nls/projectDashboard',
    'views/projectDashboard/ArticleItem'
], function (Marionette, templates, msg, ArticleItemView) {

    return Marionette.CollectionView.extend({

        initialize : function () {
            this.listenTo(this.collection, "reset", this.render);
            this.collection.fetch();
        },

        itemView : ArticleItemView

    });

});

В элементе просмотра:

define([
    'marionette',
    'templates',
    'models/Article'
],
function (Marionette, templates, Article) {

    return Marionette.ItemView.extend({

        initialize : function () {
            console.log('itemviewrender');
        },

        template : templates.projectDashboard.articleItem
    });

});

В целом установка рабочая. Я нашел один способ заставить это работать: получить коллекцию в макете и показать CollectionView в регионе при успешном обратном вызове.

Но добавить слушателей в collectionView для коллекции не удается. Никакое событие не запускается для императивных и декларативных слушателей, таких как

this.collection.on('reset', this.render, this);

or

collectionEvents : {
  'reset' : 'render'
}

Я просто хочу перерисовать коллекцию View с ее элементами Views, если коллекция выбрана. Я уверен, что я что-то пропустил. Любая помощь приветствуется!

ОБНОВЛЕНИЕ: я нашел кое-что интересное: я уже сказал, что если я извлеку коллекцию в макете и создам collectionView при успешном обратном вызове, это сработает. Интересно: слушатели тоже работают, если я передаю выбранную коллекцию. Я запускаю их, снова вызывая this.collection.fetch() в initialize. Тогда перерисовка работает. Это должно быть что-то вокруг прохода коллекции из макета.


person pfried    schedule 01.03.2013    source источник
comment
где привязка события? разве это не должно быть в методе инициализации CollectionView? Также попробуйте использовать listenTo вместо on   -  person neebz    schedule 01.03.2013
comment
они находятся в collectionView, я должен добавить один в CollectionView для лучшего понимания, я думаю, он не работает с listenTo либо   -  person pfried    schedule 01.03.2013
comment
это интересно. в соответствии с документами кажется, что вам не нужно вручную привязывать события, поскольку Marionnette делает это автоматически за вас, см.: github.com/marionettejs/backbone.marionette/blob/master/docs/ . В этом случае это кажется странной проблемой,   -  person neebz    schedule 01.03.2013
comment
Вы можете поставить точку останова в своем приложении в строке № 1202 здесь › github.com/marionettejs/backbone.marionette/blob/master/lib/ и посмотрите, правильно ли он вызывается.   -  person neebz    schedule 01.03.2013
comment
Правильно называется   -  person pfried    schedule 01.03.2013
comment
может быть, это что-то о макете, я прочитал: github.com/marionettejs/backbone.marionette/blob/master/docs/, и это немного сбивает с толку, но, возможно, описывает странное поведение   -  person pfried    schedule 01.03.2013
comment
Какую версию Marionette вы используете? Ссылки на документы и исходный код github, указывающие на последнюю версию. Но вы используете свойство itemview в объявлении CollectionView, которое было изменено на childView в версии 2.x Marionette.   -  person Vahan Vardanyan    schedule 13.10.2014
comment
К сожалению, я больше не работаю над этим, у меня сейчас нет времени посмотреть   -  person pfried    schedule 14.10.2014


Ответы (1)


Вы хотите использовать collectionEvents

Вот пример из Marionette Docs

 Marionette.CollectionView.extend({
   collectionEvents: {
    "sync": "render"
   }
 });

В этом примере рендеринг будет запущен, когда коллекция будет полностью заполнена из вашего бэкэнда.

modelEvents и collectionEvents

person Mark Stratmann    schedule 10.11.2014