Событие CompositeView Marionette не запускается

У меня проблемы с использованием CompositeView от Marionette. Я визуализирую свою модель в своем CompositeView с помощью шаблона и хочу добавить к ней событие щелчка. Почему-то я не могу заставить события работать с помощью обработчика events: { "click": "function" } в CompositeView... Что я делаю неправильно?

var FactsMenuItem = Backbone.Marionette.ItemView.extend({
    template: tmpl['factsmenuitem'],

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

    onRender: function() {
        console.log('factsmenuitem');
    }

});

var FactsMenuView = Backbone.Marionette.CompositeView.extend({
    template: tmpl['factsmenu'],

    itemView: FactsMenuItem,

    itemViewContainer: ".subs",

    events: {
        'click': 'blaat'
    },

    blaat: function() {
        console.log('this is not working');
    },

    initialize: function() {
        this.model.get('pages').on('sync', function () {
            this.collection = this.model.get('pages');
            this.render();
        }, this);
    },

    onRender: function() {
        console.log('render factsmenu');
    }

});


var FactsLayout = Backbone.Marionette.Layout.extend({

    template: tmpl['facts'],

    regions: {
        pages: ".pages",
        filter: ".filter",
        data: ".data"
    },

    initialize: function(options) {
        this.currentPage = {};

        this.factsMenu = new FactsMenu();
        this.factsView = new FactsMenuView({model: this.factsMenu});
    },

    onRender: function() {
        this.pages.show(this.factsView);
    }

});

Редактировать: я удалил часть кода, из-за которого вопрос был неясен...

Проблема заключается в том, что события составного представления, не являющегося коллекцией (modelView ??), не запускаются. Я думаю, что это как-то связано с тем, как FactsLayoutView создает экземпляр составного представления...


person thomasjonas    schedule 15.10.2013    source источник


Ответы (2)


Проблема была вызвана способом визуализации региона. В моем FactsLayout используется этот код:

initialize: function(options) {
    this.currentPage = {};

    this.factsMenu = new FactsMenu();
    this.factsView = new FactsMenuView({model: this.factsMenu});
},

onRender: function() {
    this.pages.show(this.factsView);
}

Очевидно, вы не можете показать представление функции onRender... Мне пришлось изменить способ инициализации FactsLayout:

var layout = new FactsLayout({
    slug: slug
});
layout.render();

var factsMenu = new FactsMenu({ slug: slug });
var factsView = new FactsMenuView({model: factsMenu});

layout.pages.show(factsView);
person thomasjonas    schedule 28.10.2013

Возможно, я не очень хорошо понял ваш вопрос, но если вам нужно прослушать событие, запущенное из представления элемента в вашем составном представлении, вы должны сделать следующее.

В методе представления элемента test.

this.trigger("test");

В методе составного представления initialize.

this.on("itemview:test", function() { });

Обратите внимание, что когда событие запускается из элемента CollectionView (CompositeView — это CollectionView), к нему добавляется префикс itemview.

Надеюсь, поможет.

Редактировать: Читая ваш вопрос в другой раз, я думаю, что это неправильный ответ, но что касается вашего вопроса, я думаю, что щелчок в составном представлении фиксируется представлением элемента. Не могли бы вы лучше объяснить свою цель?

person Lorenzo B    schedule 15.10.2013
comment
Прошу прощения за неясность... Вопрос был не о событиях в представлениях элементов (они работают...), а о событиях в CompositeView (в шаблоне factmenu...) - person thomasjonas; 15.10.2013
comment
@thomasjonas Не могли бы вы опубликовать некоторые подробности о вашем шаблоне? Спасибо - person Lorenzo B; 15.10.2013
comment
ужасно извиняюсь за смехотворно поздний ответ. Оказывается, у него было что-то делать с тем, как отображается/отображается область страниц (см. Мой ответ). - person thomasjonas; 28.10.2013
comment
не могли бы вы рассказать, как я могу получить модель для представления элементов, в котором происходит тестовое событие? - person Sandip Armal Patil; 20.02.2014
comment
@SandipArmalPatil Пожалуйста, откройте новый вопрос и добавьте сюда ссылку. Спасибо. - person Lorenzo B; 20.02.2014