Я работаю над чат-клиентом, и у меня возникла проблема с системой событий Backbone.Делегат-делегат магистрали не связывает события, пока не присоединился к DOM
При запуске клиента, я сделать вид, как так:
var view = new ServerListView({collection: Chatter.servers});
Chatter.Views.servers = view;
$('#channels > ul').html(view.render().el);
работает отлично, события называются. Говоря о событиях тех являются:
events: {
"click .server": "server",
"click .server ul li": "channel",
"click .server .slider": "slide"
},
рендер метод в вопросе:
render: function(){
var self = this;
this.$el.html("");
this.collection.each(function(server){
self.$el.append(self.template(server.toJSON()));
var header = self.$el.find('li.server[data-id="' + server.id + '"]')
var connection = Chatter.Connections[server.id];
if (connection) {
if (connection.channels.length > 0) {
connection.channels.each(function(channel) {
$(header).find("ul").append("<li data-channel-id=\"" + channel.id + "\">" + channel.get('name') + "</li>");
}, self);
}
}
}, self);
this.delegateEvents();
return self;
},
Everytime это называется, он должен вновь сделать вид со всеми серверами и каналами правильно. Все отображается правильно, но события не вызываются.
Я вновь сделать его таким же образом я сделать это:
$('#channels > ul').html(Chatter.Views.servers.render().el);
по какой причине вышеуказанные события не вызывается при отображении его, любые идеи?
Благодаря
EDIT: Я забыл упомянуть, что-то:
Если я повторно вынести его:
var view = Chatter.Views.servers;
$('#channels > ul').html(view.render().el);
view.delegateEvents();
Тогда он работает просто отлично, что я знаю, что было бы хорошо, но я на 99% уверен, что мне не нужно это делать, и я не хочу этого делать каждый раз, когда я просматриваю представление.
Еще раз спасибо.
Можете ли вы рассказать мне, почему вы делаете 'html()' снова с 'el' этого представления? Он уже был прикреплен, поэтому нет необходимости повторно подключать его таким образом. Примечание: причина, по которой 'delegateEvent()' in' render() 'не работает, потому что после визуализации представления снова' html() 'будет делать' empty() '(внутренне), который будет делать' cleanData () '(который удаляет прослушиватели событий) для элемента и всех его дочерних элементов. –