2013-06-04 56 views
0

我想從coffeescript類發出事件,類似於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() 

大氣壓我有這樣的事情:

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

但這probally可以以某種方式重構,所以我發出的事件倒計時實例而不是countdown.events。我在我的項目中不使用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(或查看代碼和複製件)的原因是因爲我有一個完全正常工作的觸發器和方法可供我使用的jQuery。所以應該可以擴展它,而不是寫我自己的發射器。

回答

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' 
+0

謝謝!生病更新我的問題與答案 – Jareish

+0

@ nicksweet爲什麼使用胖箭頭('=>')而不是瘦的? – Zac

+0

@zac胖箭頭只是一個簡單的方法來聲明一個函數,並將其綁定到「this」的當前值,就像聲明一個函數一樣。您可以在這裏查看更多信息:http://coffeescript.org/#fat-arrow – nicksweet