我正在一个聊天客户端,和我遇到的问题与骨干网的事件系统。骨干delegateEvents不绑定事件,直到后连接到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;
},
每当这就是所谓的,它应该重新渲染所有的服务器和渠道正确的观点。一切都呈现正确,但事件没有被调用。
我重新呈现同样的方式我使其:
$('#channels > ul').html(Chatter.Views.servers.render().el);
无论出于何种原因使当上述事件不会被调用,任何想法?
感谢
编辑:我忘了提一句:
如果我重新渲染它:
var view = Chatter.Views.servers;
$('#channels > ul').html(view.render().el);
view.delegateEvents();
然后,它工作得很好,这我知道,会好起来的,但是我99%肯定我不应该那样做,而且我不想每次重新呈现视图时都这样做。
再次感谢。
你能告诉我为什么你用'el'这个视图再次执行'html()'?它已经被附加,不应该以这种方式重新附加。注意:'render()'中的'delegateEvent()'不起作用的原因是,因为在再次渲染视图后,'html()'将执行'empty()'(内部),这将执行'cleanData )'(它删除事件侦听器)元素及其所有子元素。 –