0

Backbone.View と同様に、coffeescript クラスからイベントを発行したいと考えています。

class Countdown extends Backbone.View
countdown = new Countdown
countdown.on "complete", ->
    something()

たとえば、backbone.js を使用しない場合は次のようになります。

class Countdown extends SomeEmitter
countdown = new Countdown
countdown.start()
countdown.on "complete", ->
    something()

Atm 私はこのようなものを持っています:

class SomeEmitter
    events: $({})
#So I need to countdown.events.on "complete"

しかし、これはおそらく何らかの方法でリファクタリングできるので、countdown.events の代わりに countdown インスタンスからイベントを発行します。私のプロジェクトでは backbone.js を使用していないので、Backbone.Events 部分だけに含めるのはばかげています。$({}) を何らかの形で拡張したり、jquery (jQuery.Event?) で利用できるものを拡張したりできるはずだと思います。

アップデート:

私は次の行に何か行くと思います:

class SomeEmitter
    constructor: ->
        @events = ${{})
    on: (eventName, cb) =>
        @events.on eventName, cb
    trigger: (eventName) =>
        @events.trigger eventName

私が Backbone.Events を使用しない (またはコードを調べて断片をコピーする) 理由は、完全に機能するトリガーと on メソッドを使用して jQuery を自由に使用できるためです。したがって、独自のエミッターを作成する代わりに、それを拡張できるはずです。

4

1 に答える 1

7

このような単純なことを行うことができます。

class SomeEmitter
    constructor: ->
        @events = complete: []
    on: (eventName, cb) =>
        @events[eventName].push(cb)
    startCountdown: =>
        # countdown logic here
        for fx in @events.complete
            fx()

class Countdown extends SomeEmitter
countdown = new Countdown()
countdown.on 'complete', -> console.log 'done'
于 2013-06-04T17:44:21.383 に答える