嵌套匿名函数中的CoffeeScript类属性

时间:2012-04-01 17:25:42

标签: javascript jquery coffeescript anonymous-function javascript-objects

我熟悉隐藏模式方法,但我仍然围绕对象原型。

我正在尝试创建一个基本类来控制我网站上的某个部分。我遇到的问题是在不同的范围内丢失已定义的类变量。例如,下面的代码工作正常,并在对象内完美地创建属性。但是,当我跳转到jQuery回调时,我失去了对存储一些jQuery对象的类变量的所有知识以供多种用途。

有没有办法从回调函数中获取它们?

class Session
    initBinds: ->
        @loginForm.bind 'ajax:success', (data, status, xhr) ->
            console.log("processed")
            return
        @loginForm.bind 'ajax:before', (xhr, settings) ->
            console.log @loader // need access to Session.loader
            return
        return
    init: ->
        @loginForm = $("form#login-form")
        @loader = $("img#login-loader")
        this.initBinds()
        return

1 个答案:

答案 0 :(得分:5)

jQuery的AJAX回调是executed in the context of

  

...表示调用中使用的ajax设置的对象($.ajaxSettings与传递给$.ajax的设置合并)

所以@(AKA this)不是调用回调时的Session实例。 CoffeeScript的方法是使用fat-arrow将回调绑定到Session实例:

  

胖箭头=>可以用来定义一个函数,并将其绑定到当前值this,就在现场。当使用基于回调的库(如Prototype或jQuery,...)时,这很有用。

我想你想这样说:

@loginForm.bind 'ajax:before', (xhr, settings) =>
    console.log @loader // --------------------^^
    return

除非你的回调中的最后一个语句在你不想取消AJAX调用时可能会意外地评估为return,否则根本不需要false;如果你想成为偏执狂(一个合理的位置,因为他们真的是为​​了得到我们),那么最后一个简单的true就足以获得非false值从回调中返回:

@loginForm.bind 'ajax:before', (xhr, settings) =>
    console.log @loader // --------------------^^
    true