5

在Backbone中,我正在使用新的Backbone.listenTo事件。我的一個實例都具有連接到三個不同的事件,例如: -如何從Backbone.listenTo查找觸發事件?

this.listenTo(this._Collection, 'reset add change', this._setCollection); 

時,它應該和有沒有問題有它相應地稱爲監聽器。我不知道的是如何找出哪個事件被觸發。我有機會使用e參數:

_setCollection: function(e) { 
    // Do fun stuff 
} 

的問題是,e參數只發送收集的副本,並沒有提到什麼事件實際上被觸發。我試過e.typee.target但這些對象不存在。下面是來自Chrome瀏覽器開發工具e對象的副本:

_byCid: Object 
_byId: Object 
_events: Object 
    add: Array[1] 
    change: Array[1] 
    remove: Array[1] 
    reset: Array[1] 
__proto__: Object 
_listenerId: "l16" 
length: 3 
models: Array[3] 

我如何才能找到什麼事件被觸發?

編輯:答案澄清:雖然明顯的答案是技術上是正確的,正如mu_is_too_short指出了正確的答案是使用多個處理程序,而不是執行此類「欺騙」的

回答

9

你無法檢測到的事件類型直接,但在某些情況下,你可以從arguments推斷出來。該events catalog有這樣一段話:

  • 「添加」(模型,收藏,選項) - 當一個模型被添加到集合。
  • 「重置」(集合,選項) - 集合的全部內容已被替換時。
  • 「change」(model,options) - 當模型的屬性發生變化時。

幸運的是,所有這三個事件有不同的參數,所以arguments內容將唯一(在這種情況下)確定觸發事件:

  1. 如果arguments[0]是一個模型,arguments[1]是一個集合,那麼你有一個"add"事件。
  2. 如果arguments[0]是一個集合,那麼你有一個"reset"事件。
  3. 如果arguments[0]是模型,arguments.length是2,那麼你有一個"change"事件。

所以,你可以做一些令人不愉快的和脆弱的像這樣在你的_setCollection

// M is your model, C is your collection. 
    if(arguments[0] instanceof M 
    && arguments[1] instanceof C) { 
     // An "add" event... 
    } 
    else if(arguments[0] instanceof C) { 
     // A "reset" event... 
    } 
    else if(arguments[0] instanceof M 
     && arguments.length == 2) { 
     // A "change" event... 
    } 
    else { 
     console.log('confusion!'); 
    } 

演示:http://jsfiddle.net/ambiguous/Y9UUX/

我不會推薦這種欺騙雖然,它是kludgey,脆弱,並且如果向列表中添加更多事件類型可能會中斷。如果您的事件處理程序需要知道觸發事件的類型,那麼對每種事件類型使用單獨的處理程序會更好:三個函數和三個listenTo調用比一小堆醜陋的駭客更好。

+0

是的,完全同意。我發現這個問題是因爲我正在查看remove事件並將其全部包含在一個函數中。我注意到這些論據是不同的,應該把這個問題提出來。無論如何,謝謝你的黑客。我將使用不同的處理程序。 – Brandon