2013-04-14 2 views
0

Что у меня есть следующие:Магистральные LayoutManager delegateEvents на подвид не работает

Views.Parent = Backbone.View.extend({ 
    template: "parent", 
    initialize: function() { 
     this.render(); 
    }, 
    beforeRender: function() { 
     this.setView(".foo", new Views.Child({ 
      model: this.model 
     }); 
    }, 
    afterRender: function() { 
     this.$el.html(Handlebars.compile(this.$el.html()).call(this, this.model.attributes)); 
     var foo = this.getView(".foo"); 
     foo.delegateEvents(); 
    } 
}); 

Views.Child = Backbone.View.extend({ 
    template: "child", 
    events: { 
     "click input": "inputClick" 
    }, 
    initialize: function() { 
     this.listenTo(this.model, "change", this.render); 
    }, 
    inputClick: function() { 
     console.info("Input Clicked"); 
    }, 
    afterRender: function() { 
     this.$el.html(Handlebars.compile(this.$el.html()).call(this, this.model.attributes)); 
     var foo = this.getView(".foo"); 
     foo.delegateEvents(); 
    } 
}); 

События в Views.Child не стреляли. Вид определенно найден, и foo.events возвращает правильные события. Я пробовал несколько способов вставки моего подзадача, делегировать его просто не делает.

Есть ли кто-нибудь еще в этом и может предложить любое понимание?

Следует упомянуть, что я использую свойство events и this.listenTo в подзадаче. Ни один из них не уволен.

Редактировать: Родитель добавляется к другой точке зрения, как, например: this.$el.append(parentView.$el);

Где parentView это проиллюстрированный объект Views.Parent.

+0

Что выглядит Views.Child? – domino

+0

Я обновил сообщение. Это упрощенная версия кода, который я фактически запускаю для ясности. – aef

+0

'this.listenTo (model," change ", this.render);' '" model "' не должна быть строкой – domino

ответ

1

Когда вы вызываете this.$el.html в afterRender, вы переписываете текущий HTML-код и каждое связанное событие/дочерний вид. Таким образом, вы удаляете дочерний вид, который вы устанавливаете в beforeRender.

Вот почему у вас не было никакого события.

Я хотел бы дать более подробную информацию о том, как вы должны упорядочить свой код ... Но я не понимаю, что вы пытаетесь сделать в afterRender, это не имеет никакого смысла. Скомпилируйте весь код вашего шаблона в параметрах конфигурации fetch и render, а не в afterRender.

Небольшое примечание:
beforeRender: где вы установили ребенок рассматривает
afterRender: где вы связать события или Startup JQuery плагинов и т.д. Вы не должны касаться DOM здесь.

+0

Вы прибили ее, я неправильно использовал layoutmanager. Я смог реорганизовать дескрипторы в LayoutManager.fetch и использовать сериализацию для передачи контекста. Большое вам спасибо за помощь. – aef

+0

Было приятно, удачи. Кстати, не стесняйтесь прыгать в # базовом канале IRC, если вы хотите обсудить больше концепций. –

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