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