0

У меня есть приложение, в котором один тип представления вложен в один и тот же тип. Что-то вроде этого http://take.ms/ylAeqВложенные представления: привязки событий с надлежащим ui

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

У меня есть ситуации, когда у меня есть ~ 10 выстрелил события Потому магистральная связывает событие для всех внутренних кнопок, а не только кнопки надлежащего зрения

У меня есть одна идея - я сделать в шаблоне id="node_body_<%= id %>" так на основе каждой кнопки идентификатор на идентификаторе модели его представления. Но как я могу передать объект события? события: { "click #node_body_" + id : 'method' } не работает.

ответ

1

Вопрос - это событие пузыри. События на вашем пузыре внутреннего видения до el его родительского представления, который прослушивает события на одном и том же селекторе, в свою очередь вызывая его обработчик.

Это может быть исправлено путем остановки распространения события в обработчике соответствующего вида по:

Backbone.View.extend({ 
    events: { 
    'click .thing': 'do_thing' 
    }, 
    do_thing: function(event) { 
    event.stopPropagation(); // prevents event reaching parent view 
    } 
}); 
+0

Спасибо u за ур ответ, но у меня один вид вида вложенные друг в друга. Итак, если я буду использовать эту функцию do_thing, я нарушу запуск события на каждом представлении (родительский и дочерний) –

+0

@PavelPoberezhnyi Я понимаю, что у вас одинаковый вид вложенных. Таким образом, каждый взгляд имеет свой собственный метод do_thing. когда событие запускается в представлении, оно будет вызывать метод 'do_thing', и ни одно из других представлений не вызовет их' do_thing'. Разве это не то, что вы хотите? –

+0

Спасибо, теперь я понимаю идею ур. Я попробую и даю обратную связь –

0

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

Backbone.View.extend({ 
    events: { 
     'click .thing': 'do_thing' 
    }, 
    do_thing: function() { ... } 
}); 

и

Backbone.View.extend({ 
    events: function() { 
     return { 
      'click .thing': 'do_thing' 
     }; 
    }, 
    do_thing: function() { ... } 
}); 

Так что, если ваш events зависит от свойств зрения, то вы хотите использовать функцию вместо объекта буквальный:

events: function() { 
    var events  = { }; 
    var event_spec = 'click #nody_body' + this.id; 
    events[event_spec] = 'method'; 
    return events; 
} 

это предполагает, что id является свойство зрения, что вы используете в шаблоне.

+0

Briliant. Спасибо за ур ответ. Я попробую это решение –