Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从coffeescript类发出事件_Javascript_Jquery_Coffeescript - Fatal编程技术网

Javascript 从coffeescript类发出事件

Javascript 从coffeescript类发出事件,javascript,jquery,coffeescript,Javascript,Jquery,Coffeescript,我想从coffeescript类发出事件,类似于Backbone.View class Countdown extends Backbone.View countdown = new Countdown countdown.on "complete", -> something() 因此,如果没有backbone.js,例如: class Countdown extends SomeEmitter countdown = new Countdown countdown.start

我想从coffeescript类发出事件,类似于Backbone.View

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"
但这可能会以某种方式被重构,因此我从倒计时实例而不是倒计时.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(或者查看代码和拷贝片段),是因为我有一个完全工作的触发器和on方法来处理jQuery。所以应该可以扩展它,而不是编写我自己的发射器。

您可以做这样简单的事情

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'

@nicksweet为什么要使用粗箭头(
=>
)而不是细箭头?@zac粗箭头只是一种简单的方法,既可以声明函数,又可以将其绑定到当前值“this”,就像只声明函数一样。您可以在此处查看更多信息: