4

如果这是一个愚蠢的问题,我只是第一次看到CoffeeScript。我熟悉隐藏的模式方法,但我仍然围绕着对象原型。嵌套匿名函数内的CoffeeScript类属性

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

回答

4

jQuery的AJAX回调是executed in the context of

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

的对象,以便@(AKA this)在调用回调函数时不是您的Session实例。解决这个问题的CoffeeScript的上下的方式是使用回调绑定到会话实例fat-arrow

脂肪箭头=>可以用于两种定义一个函数,并把它绑定到的this当前值,就地当场。使用基于回调的库,例如Prototype或jQuery的,如果这是有帮助...

我想你要这样说:

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

而且你不需要return,除非是当您不想取消AJAX呼叫时,回拨中的最后一条语句可能会意外评估为false;如果你想成为偏执(一个合理的位置,因为他们真的外出让我们)然后在最后一个简单的true就足以让回调函数返回一个非false值:

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

优秀。感谢您的详细回复。胖箭是我正在寻找。 – Aric 2012-04-01 22:45:28