2014-06-07 25 views
2

一個迷惑我有內部Backbone.view_.after:與上下文

擴展這個功能
toggle: function() { 
    var sempurna = _.after(array_obj.length, this.render); 
    _.each(array_obj, function (v,k) { 
     v.perormSomething(); 
     delete array_obj[key]; 
     sempurna(); 
    }, this); 
} 

所以,我以爲我可以渲染視圖立刻循環完成。但不知何故this關鍵字是指window而不是視圖。我如何指向預期的this進行查看。

回答

3

this是因爲你在沒有點號(所以沒有任何明確的接收對象)調用sempurna()設置爲window

要解決這個問題,你需要_.bind(或使用(如果可用)瀏覽器的本地綁定)你sempurnathis

toggle: function() { 
    var sempurna = _.bind(_.after(array_obj.length, this.render), this); 
    _.each(array_obj, function (v,k) { 
     v.perormSomething(); 
     delete array_obj[key]; 
     sempurna(); 
    }, this); 
} 

演示JSFiddle

+0

如果這更有意義,你也可以綁定'render':'_.after(array_obj.length,_(this.render).bind(this))'。 –

+0

'var sempurna = _.after(array_obj.length,_.bind(this.render,this))''。這個我只是在玩過@muistooshort代碼後才發現的。謝謝 – Muhaimin

+0

@MuhaiminAbdul:'_(x).bind(y)'和'_.bind(x,y)'做同樣的事情,我傾向於使用'_(x).f(y)'形式,因爲我發現它更易於閱讀。 –