2012-07-16 27 views
2

有沒有辦法自動做一個backbone.js對象的_.bindAll?自動_.bindAll()backbone.js

前段時間我在跟別人說話,他們說有,但我不知道從哪裏開始尋找。

例子:

var TheView = Backbone.View.extend({ 

    initialize: function() { 
     // HOW CAN I AVOID HAVING TO DO THIS?----> 
     _.bindAll(this,'render','on_element_01_click', 'on_element_02_click'); 
    }, 

    events: { 
     'click #element_01': 'on_element_01_click', 
     'click #element_02': 'on_element_02_click', 
    }, 

    render: function(){ 
     return this; 
    }, 

    on_element_01_click: function(){ 

    }, 

    on_element_02_click: function(){ 

    } 
} 
+0

'events'處理程序會自動在適當的範圍內調用,不應該綁定它們。 – loganfsmyth 2012-07-19 16:48:07

回答

5

而是執行此操作:

_.bindAll(this); 

將綁定在該視圖中的所有功能。

+4

請注意,這不再適用於下劃線v。1.5.0。您需要傳入方法名稱。 – Lukas 2013-07-30 20:35:45

+0

@盧卡斯是正確的(雖然不知道確切的版本)。 – Poni 2013-12-22 15:57:09

1

我嘗試這樣做我自己,我能得到它的東西的工作是這樣的:

function bindOnExtend(clazz) { 
    var originalExtend = clazz.extend; 
    clazz.extend = function() { 
     var newSubClass = originalExtend.apply(this, arguments); 
     var originalInitialize = newSubClass.prototype.initialize; 
     newSubClass.prototype.initialize = function() { 
      // The constructor will get broken by bindAll; preserve it so _super keeps working 
      var realConstructor = this.constructor; 
      _.bindAll(this); 
      this.constructor = realConstructor; 
      originalInitialize.apply(this, arguments); 
     }; 
     return bindOnExtend(newSubClass); 
    }; 
    return clazz; 
} 

var BoundModel = Backbone.Model.extend(); 
bindOnExtend(BoundModel); 

var BoundView = Backbone.View.extend(); 
bindOnExtend(BoundView); 

不過,我不會推薦它。這樣做會使每個單一模型/視圖/實例化的每一個方法都關閉。這不僅會增加整體內存使用量,而且如果不小心,還會造成內存泄漏的可能性。此外,它使您的堆棧跟蹤更長,因爲它們必須通過bindOnExtend。

以我的經驗,不必做「_.bindAll(this, ...」是值得的,因爲:

1)它使我的代碼更清晰/有目共睹的任何人在我 2推出)鼓勵我的資格我bindAll,而不是僅僅使用1-arg形式 3)我討厭通過長堆棧涉水

但是,如果你想要它,上面的代碼應該工作。

2

如果你想在你的視圖中建立bindAll(這對於像事件處理程序那樣沒有自動綁定的AJAX回調方法是很方便的),我已經學會了一種更簡單的技術。基本上你只是重寫構造函數來執行自動綁定。

var BoundModel = Backbone.Model.extend({ 
    constructor: function() { 
     Backbone.Model.apply(this, arguments); 
     if (this.boundMethods) { 
      _(this).bindAll.apply(this, this.boundMethods); 
     } 
    } 
}) 

var SubclassOfBoundModel = Backbone.Model.extend({ 
    boundMethods: ['handleFetchResponse'], 
    initialize: function() { 
     this.model.on('sync', this.handleFetchResponse); 
    } 
    handleFetchResponse: function() { 
     // this function is bound to the model instance 
    } 
}) 

當然,如果你只是想所有的方法,你可以離開了「boundMethods」部分結合,只是有:

constructor: function() { 
     Backbone.Model.apply(this, arguments); 
     _(this).bindAll(); 
    }