Получить ссылку на исходный объект в обработчике события в Backbone.js - PullRequest
1 голос
/ 28 марта 2012

Как я могу получить ссылку на ImageListItemView, который инициировал событие в моем обработчике событий?

addOne: function(image){
    var imageListItemView = new ImageListItemView({model: image});
    imageListItemView.on('imageListItemView:click', this.itemViewClick, this)
    imageListItemView.render();
    this.$el.append(imageListItemView.el); 
},

itemViewClick: function(){
    //Get reference to ImageListItemView that originated event
}

Вот ImageListItemView:

// ImageListItemView
//-------------------------------------------------------------------------------//

window.ImageListItemView = Backbone.View.extend({

    initialize: function(){
        this.model.on('change', this.render, this);
        this.model.on('destroy hide', this.remove, this);
        this.model.on('image:selectionChange', this.select, this);
    },

    events : {
        "click" : "onClick"
    },

    className: 'item_view',
    template: _.template($('#image_list_item_view_template').html()),

    render: function(){
        this.$el.html(this.template(this.model.toJSON()));

        if(this.model.selected){
            this.$el.addClass('selected');
        }else{
            this.$el.removeClass('selected');
        }
    },

    remove: function(){
        this.$el.remove();
    },

    select: function(){
        this.render();
    },

    onClick: function(e){
        this.trigger('imageListItemView:click');
    }


})

А вот ImageListView:

// ImageListView
//-------------------------------------------------------------------------------//

window.ImageListView = Backbone.View.extend({


    className: 'image_list_view',
    tagName: 'nav',

    initialize: function(){
        this.collection.on('add', this.addOne, this);
        this.collection.on('reset', this.addAll, this);
    },

    render: function(){
        this.addAll();
        return this;
    },

    addAll: function(){
        this.$el.empty();
        this.collection.forEach(this.addOne, this);
    },

    addOne: function(image){
        var imageListItemView = new ImageListItemView({model: image});
        imageListItemView.on('imageListItemView:click', this.itemViewClick, this)
        imageListItemView.render();
        this.$el.append(imageListItemView.el); 
    },

    itemViewClick: function(e){
         //Get reference to ImageListItemView that originated event
         //e is undefined
        //this.collection.setSelectedImage(this.model);
    }

})

1 Ответ

0 голосов
/ 28 марта 2012

Ну, я не специалист по Backbone, но вы пытались заменить контекст события?

т.е.

imageListItemView.on('imageListItemView:click', this.itemViewClick, imageListItemView);

Если я правильно понимаю, то this внутри itemViewClick должно относиться к ImageListItemView.

Стоит попробовать.

...