0

このチケットは役に立たず、サンプルも役に立ちません。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 を使用する必要がありますが、例ではすべてがインスタンス化されていることを前提としています。

4

1 に答える 1

0

これは期待どおりに機能します

Backbone.View::addEvents = (events) ->
  @events = _.extend @events or {}, events
  @delegateEvents()
于 2012-12-04T19:24:46.020 に答える