このチケットは役に立たず、サンプルも役に立ちません。jQuerydelegate
を正しく動作させることができないようです。
イベントを動的に正しく宣言しない JSFiddle を次に示します。どうすればいいですか?
フィドルで何が起こっているのですか?
動的イベントのオーバーライド:
Backbone.View::addEvents = (events) ->
@delegateEvents _.extend(_.clone(@events), events)
DOM セレクター/イベントを集約するクラス。そのため、対応する HTML を 1 回だけ宣言します。
class Els
constructor: () ->
@signupButton = 'button#signup'
events: () ->
events = { }
events['click ' + @signupButton] = 'clickSignup'
events
DOM 操作を処理するクラス:
class UI extends Backbone.Model
disableButton: () ->
$(els.signupButton).addClass('disabled')
マリオネット ビュー:
class MyRegion extends Backbone.Marionette.Region
el: '#default-region'
class MyLayout extends Backbone.Marionette.Layout
template: '#template-layout'
regions:
content: '#region-content'
#events:
#'click button#signup': 'clickSignup'
initialize: (options) ->
# This seems correct
alert JSON.stringify(options.dynamicEvents)
# FAIL!
@addEvents options.dynamicEvents
close: () ->
@remove()
@unbind()
clickSignup: (event) ->
ui.disableButton()
アプリの開始:
els = new Els()
ui = new UI()
app = new Backbone.Marionette.Application()
app.start { }
region = new MyRegion()
region.show new MyLayout(
dynamicEvents: els.events()
)
内でイベント バインディングも宣言できればすばらしいと思いますEls
。たとえば、次のようになります。
class Els
constructor: () ->
@signupButton = 'button#signup'
events: () ->
events = { }
events['click ' + @signupButton] = (event) ->
ui.disableButton()
events
本当に EventEmitter を使用する必要がありますが、例ではすべてがインスタンス化されていることを前提としています。