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

4

我熟悉隐藏式样法,但我仍在努力理解对象原型。

我正在尝试创建一个基本类来控制我的网站上的一个部分。我遇到的问题是,在不同范围内丢失了已定义的类变量。例如,下面的代码可以正常工作,并完美地在对象中创建属性。但当我进入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个回答

5
jQuery的AJAX回调函数在调用时会在代表ajax设置的对象($.ajaxSettings与传递给$.ajax的设置进行合并)的上下文中执行
因此,在回调被调用时,@(也就是this)不是您的Session实例。解决这个问题的CoffeeScript方式是使用fat-arrow将回调绑定到您的Session实例:

肥箭头=>既可以用于定义函数,也可以立即将其绑定到this的当前值上。当使用基于回调的库,如Prototype或jQuery时,这非常有用...

我认为你想说的是这个:
@loginForm.bind 'ajax:before', (xhr, settings) =>
    console.log @loader // --------------------^^
    return

只有在你的回调函数中的最后一个语句可能意外地评估为false并且你不想取消AJAX调用时,你才需要return;如果你想要保持警惕(这是一个合理的立场,因为他们确实在追求我们),那么在结尾处简单地使用true就足以从回调函数中返回一个非false值:

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

1
太好了。感谢您详细的回复。我正在寻找的是“fat arrow”。 - Aric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接