开发者

Referencing parent class in CoffeeScript from a jQuery callback

开发者 https://www.devze.com 2023-04-12 05:19 出处:网络
I\'m new to CoffeScript and I was wondering if there\'s a way of writing the following piece of code without referencing the global variable app:

I'm new to CoffeScript and I was wondering if there's a way of writing the following piece of code without referencing the global variable app:

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()

Using the fat arrow doesn't work, as then I lose reference to the jQuery object, i.e.

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) ->
        # ...

The first piece of code works, but I want to get rid of the global variable if possible :-)

Cheers, Gaz.


Your click handler gets an event passed in... so you can get the best of both worlds with the "fat arrow" without the need to also reference self :

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


Well, CS is just a higher-level syntax for JS.

In JS this can only reference a single object.

The fat arrow uses closure to make this equal to a higher level this, nothing more, and that's why it overrides this in a callback's scope

The plain arrow, in contrary, is just a function alias, and that's why this is a DOM element in the first case.

Finally, @something is trivially translated to this.something, and does nothing more.

So, my opinion - your best choice is really doing self = @ before the binding.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号