从jQuery回调引用CoffeeScript中的父类

Gaz*_*Gaz 7 javascript coffeescript

我是CoffeScript的新手,我想知道是否有一种方法可以在不引用全局变量应用程序的情况下编写以下代码:

class App 

    constructor: ->
        @ui = ui.init()
        $('#content-holder a[rel!=dialog]').live 'click', ->
            link = $(@).attr 'href'
            app.loadUrl link
            return false

    loadUrl: (href) ->
        # ...

app = new App()
Run Code Online (Sandbox Code Playgroud)

使用胖箭头不起作用,因为我失去了对jQuery对象的引用,即

class App   
    constructor: ->
        @ui = ui.init()
        $('#content-holder a[rel!=dialog]').live 'click', =>
            # @ now references App
            link = $(@).attr 'href'
            this.loadUrl link
            return false

    loadUrl: (href) ->
        # ...
Run Code Online (Sandbox Code Playgroud)

第一段代码可以工作,但如果可能的话我想摆脱全局变量:-)

干杯,加兹.

Bri*_*sio 11

您的点击处理程序会传入一个事件...所以您可以使用"胖箭"获得两个世界中最好的,而无需参考self:

constructor: ->
    @ui = ui.init()
    $('#content-holder a[rel!=dialog]').live 'click', (e) =>
        link = $(e.target).attr 'href'
        @loadUrl link
        return false
Run Code Online (Sandbox Code Playgroud)


Gua*_*ard 6

好吧,CS只是JS的更高级语法.

在JS this中只能引用单个对象.

胖箭头使用闭包使得this等于更高级别this,仅此而已,这就是它this在回调范围内覆盖的原因

相反,普通箭头只是一个function别名,这就是为什么this在第一种情况下是DOM元素的原因.

最后,@something简单地翻译成this.something,并且不做任何其他事情.

所以,我的意见 - 你最好的选择是self = @在绑定之前做的.