Подтвердить что ты не робот

Backbone.js Связывание событий

Я использую Backbone.js, который имеет сегментированный элемент пользовательского интерфейса управления для каждого вида модели. Каждый из них состоит из ul с несколькими элементами li. Я хочу связать событие таким образом, что при щелчке одного из этих элементов я могу определить, какой из них был нажат, и обновить модель с соответствующим значением.

Проблема заключается в том, что Backbone связывает события (они находятся в хэш-представлении событий), так что "this" в функции обратного вызова относится к представлению, а не к элементам li. Это означает, что я не могу определить, какой из нескольких элементов li был нажат. Если я использовал обычную привязку jQuery, я могу привязать "this" к элементам li, но потом я больше не отслеживаю модель, поэтому я не могу ее обновить.

4b9b3361

Ответ 1

jQuery привычка устанавливать this к тому, что будет удобно в то время, является довольно неприятной моделью, на мой взгляд - к счастью, вам никогда не придется полагаться на нее:

onClick: function(e) {
  this;                // Still the view instance (as it should be).
  e.target;            // The element that was clicked.
  e.currentTarget;     // The element that was bound by the click event.
}

... Вы можете использовать target или currentTarget объекта события, если это необходимо.

Ответ 2

Не могу понять, почему я не могу прокомментировать ответ @jashkenas выше. Его метод правильный (спасибо!), Но я подумал, что я проясню ситуацию: в обработчике событий вы можете восстановить элемент, к которому было привязано событие. Пример кода базовой линии будет выглядеть так:

MyView = Backbone.View.extend({
    events: {
        'click .item': 'handleClick'
    },

    handleClick: function(e) {
        this; // The view instance
        e.target; // The element that was clicked 
        e.currentTarget; // The element that was bound by the click event
    }
});

Я использую это, чтобы настроить текст по умолчанию во всех моих полях формы... да, я еще немного не в HTML5:)

Edit: Btw, e.target является сырым элементом. Вам нужно будет использовать $(e.target), чтобы получить доступ к jQuery.