Чаплин без контекста после перерисовки шаблона
Я пытаюсь получить представление, которое может иметь взаимозаменяемые шаблоны. Поэтому, нажав на один из флажков, вы снова увидите представление. это на самом деле происходит. но после повторного отображения представления и правильного отображения нового шаблона я теряю контекст и все щелчки, привязанные к этому представлению, больше не работают. http://pastebin.com/bFJ5Yuer
View = require 'views/base/view'
template = require 'views/templates/list_view_a'
module.exports = class OfferListView extends View
autoRender: true
container: "[data-role='content']"
containerMethod: 'html'
initialize: ->
super
@template = template
#views
@delegate 'change', '#list_view_a', @change_list_view
@delegate 'change', '#list_view_b', @change_list_view
@delegate 'change', '#list_view_c', @change_list_view
@delegate 'click', @click_ev
change_list_view: (event) =>
console.log('change')
@template = require 'views/templates/' + event.target.id
@render()
click_ev: =>
console.log('click')
getTemplateData: =>
@collection.toJSON()
Есть указатели?
2 ответа
Да, звонок в @render
в change_list_view
уничтожает элемент, с которым связаны события в initialize
метод.
Если вам необходимо повторно отобразить представление (например, если вы меняете шаблон), вам просто нужно добавить вызов @delegateEvents
ниже @render
вызывать change_list_view
,
ОБНОВИТЬ
Если вы хотите переключиться на метод subview, вы, вероятно, можете избавиться от этого второго вызова render. Что-то вроде этого:
# snipped all the outer require js stuff
class InnerViewBase extends Chaplin.View # Or whatever your base view is
autoRender: true
container: "#innerViewContainer"
containerMethod: "html"
initialize: (templateName) ->
@template = require templateName
super
class ListViewA extends InnerViewBase
initialize: ->
super "views/templates/list_view_a"
# Do any event handlers in here, instead of the outer view
# @delegate 'click', @click_ev
class ListViewB extends InnerViewBase
initialize: ->
super "views/templates/list_view_b"
class ListViewC extends InnerViewBase
initialize: ->
super "views/templates/list_view_b"
class OfferListView extends View
autoRender: true
container: "[data-role='content']"
containerMethod: 'html'
initialize: ->
super
@template = template
#views
# Consider changing these three id subscriptions to a class
@delegate 'change', '#list_view_a', @change_list_view
@delegate 'change', '#list_view_b', @change_list_view
@delegate 'change', '#list_view_c', @change_list_view
@delegate 'click', @click_ev
afterRender: ->
# Add a default ListView here if you want
# @subview "ListView", new ListViewA
change_list_view: (event) =>
console.log('change')
# Make a hacky looking map to the subview constructors
viewNames =
"list_view_a": ListViewA
"list_view_b": ListViewB
"list_view_c": ListViewC
@subview "ListView", new viewNames[event.target.id]
click_ev: =>
console.log('click')
getTemplateData: =>
@collection.toJSON()
Вызов @delegateEvents не сработал. Но спасибо, что указал мне правильное направление. Это было полезно также. Магистраль: событие потеряно при повторном рендеринге
помните мой неправильный отступ
View = require 'views/base/view'
template = require 'views/templates/list_view_a'
module.exports = class OfferListView extends View
autoRender: true
container: "[data-role='content']"
containerMethod: 'html'
template: template
initialize: (options) ->
super
#views
change_list_view: (event) =>
@template = require 'views/templates/' + event.target.id
@render()
initEvents: =>
@delegate 'change', '#list_view_a', @change_list_view
@delegate 'change', '#list_view_b', @change_list_view
@delegate 'change', '#list_view_c', @change_list_view
@delegate 'click', @click_ev
click_ev: ->
console.log('click')
render: =>
super
afterRender: =>
super
@initEvents()