2012-10-04 92 views
0

我想這樣做的時候傳遞一個函數骨幹的成功回調這樣如何避免功能包傳遞一個回調

this.model.fetch({ 
    success: this.setup 
}); 

但是,這是行不通的我最終不得不通過整個環境和包裹在這樣的功能裏面:

var that = this; 
this.model.fetch({ 
    success: function(){ 
     that.setup(); 
    } 
}); 

爲什麼我不能這樣做?即使我將設置函數綁定到它的父項像_.bind(this.setup, this);那樣,它仍然不會使用正確的(它的父項)。但只有當其'不包含在函數中...

+0

'_.bind'應該爲第一個代碼片段 –

+0

工作,沒有解釋過。但顯然,bindall只是工作 – nimrod

回答

2

_.bind返回綁定到對象的函數,它不會修改原始函數(基本上它會創建您編寫的包裝函數)。

但是,你可以通過這個綁定函數作爲回調

this.model.fetch({ 
    success: _.bind(this.setup, this); 
}); 

或使用_.bindAll這不修改對象來使用綁定功能:

var V = Backbone.View.extend({ 
    initialize: function() { 
     _.bindAll(this, "setup"); 

     this.model.fetch({ 
      success: this.setup 
     }); 
    }, 
    setup: function() { 

    } 
}); 
+0

我真的需要知道這兩個函數之間的區別以及它們的確做了什麼。感謝您指點我正確的方向! – nimrod

+1

@nimrod _.bind在保證綁定的情況下創建一個新函數,_.bindAll修改一個對象(第一個參數)以用綁定函數替換所有成員函數(或作爲參數傳遞的函數)。看看註釋的源代碼,它大部分是可讀的http://underscorejs.org/docs/underscore.html#section-58 – nikoshr

-1

並不怎麼一回事,因爲「這個」工作是你定義的對象({success:this.setup})試試這個:

var that = this; 
this.model.fetch({ 
     success: that.setup 
    } 
}); 

然而,我不喜歡它太多,因爲事件處理程序就是這樣,它們處理事件,然後做東西(如setup()方法),在這種情況下,您可能會在閉包中丟失對象。

+0

這正是我想要避免的,我在我的問題中說,不是有用的答案對不起。 – nimrod