Магистральные события, запускаемые при связывании
Мне нужно привязать события клика к определенному количеству специальных div, которые должны быть связаны, известны только во время выполнения, поэтому я подумал просто установить класс для всех этих специальных div и связать их в "events", но затем нажать на один из эти div-ы вызовут запуск всех div-ов, тогда я попытался использовать переменные в событиях, но эти переменные известны только во время выполнения, поэтому оказывается, что они не определены при привязке событий, сейчас я использую jQuery для привязки событий внутри Backbone во время выполнения, но всякий раз, когда я инициализирую представление, событие запускается сразу
var RoomNumber = Backbone.View.extend({
el: $('#roomColumn' + this.roomNumber),
initialize: function () {
_.bindAll(this, 'render');
this.user = this.options.user;
this.roomNumber = this.options.roomNumber;
this.render();
//$('#roomNumber'+this.roomNumber).on('click', this.enterBooking());
},
render: function () {
$(this.el).append("<div class = 'roomNumber' id = 'roomNumber" + this.roomNumber + "'>" + this.roomNumber + "</div>");
},
enterBooking: function () {
var slideForm = new SlideForm({
user: this.user,
roomNumber: this.roomNumber,
state: 'book',
singleSchedule: new Schedule()
});
}
});
Кто-нибудь любезно объяснит, почему это произойдет? И как я могу привязать события к динамически генерируемым div?
(Я знаю, что, вероятно, не следовало использовать такое представление магистрали, но это часть требований)
2 ответа
У вашего кода две проблемы:
Отвечая вашей точке зрения, события запускаются при привязке, потому что вы вызываете обработчик событий во время привязки.
$('#roomNumber'+this.roomNumber).on('click', this.enterBooking());
должно быть$('#roomNumber'+this.roomNumber).on('click', this.enterBooking);
Обратите внимание на фигурные скобки вызова.То, как вы настроили эль, неверно
el: $('#roomColumn' + this.roomNumber),
В позвоночнике,el
свойство представления устанавливается доinitialize
метод вызывается. Это будет означать, что магистраль будет пытаться найти элемент$('#roomColumnundefined')
чего не ожидается. Вместо этого вы можете передатьel
элемент как опция для представленияvar roomNumber = 3; var view = new RoomNumber({ roomNumber:roomNumber, el:$('#roomColumn' + roomNumber) });
......
//Pseudo code
render: function () {
$(this.el).append("<div class = 'roomNumber' id = 'roomNumber" + this.roomNumber + "'>" + this.roomNumber + "</div>");
//you can dynamic set up events like this:
this.events["click #roomNumber"+this.roomNumber] = "enterBooking";
this.delegateEvents(this.events);
},
......