2015-05-25 1 views
0

Я работаю над чат-клиентом, и у меня возникла проблема с системой событий 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% уверен, что мне не нужно это делать, и я не хочу этого делать каждый раз, когда я просматриваю представление.

Еще раз спасибо.

+0

Можете ли вы рассказать мне, почему вы делаете 'html()' снова с 'el' этого представления? Он уже был прикреплен, поэтому нет необходимости повторно подключать его таким образом. Примечание: причина, по которой 'delegateEvent()' in' render() 'не работает, потому что после визуализации представления снова' html() 'будет делать' empty() '(внутренне), который будет делать' cleanData () '(который удаляет прослушиватели событий) для элемента и всех его дочерних элементов. –

ответ

1

This stackoverflow question might help. У вас есть функция инициализации для представления? Возможно, функция инициализации может принимать аргумент (объект jQuery, который указывает, где должен отображаться представление), так что он превращается в нужное место на странице, тогда вы можете делегировать события в функции инициализации, если события aren ' t делегировано автоматически.

В любом случае, я был бы заинтригован услышать от других.

+0

Вот что я в итоге сделал. Я передал селектор в инициализацию представления и просто установил HTML-элемент в функции рендеринга, а не после его визуализации. Это сработало, но я действительно надеялся найти способ обойти это, потому что мне не нравится привязывать классы представления к DOM напрямую. Однако, спасибо! – Jake

 Смежные вопросы

  • Нет связанных вопросов^_^