2015-05-25 60 views
0

我正在一个聊天客户端,和我遇到的问题与骨干网的事件系统。骨干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%肯定我不应该那样做,而且我不想每次重新呈现视图时都这样做。

再次感谢。

+0

你能告诉我为什么你用'el'这个视图再次执行'html()'?它已经被附加,不应该以这种方式重新附加。注意:'render()'中的'delegateEvent()'不起作用的原因是,因为在再次渲染视图后,'html()'将执行'empty()'(内部),这将执行'cleanData )'(它删除事件侦听器)元素及其所有子元素。 –

回答

1

This stackoverflow question might help.你有看法的初始化函数?也许初始化函数可以接受一个参数(指定视图应该渲染到哪里的jQuery对象),以便它将自身渲染到页面上的适当位置,然后如果事件不是“自动委派。

在任何情况下,我都很想听到别人的消息。

+0

这就是我最终做的。我将一个选择器传递给视图的初始化,并且只是在render函数中设置元素的HTML,而不是在渲染之后。这工作,但我真的希望找到解决这个问题的方法,因为我不喜欢直接绑定视图类到DOM。谢谢你! – Jake