2016-12-06 108 views
1

我在閱讀docs for Views,我對eventsdelegateEvents之間的區別感到困惑。它們在View對象上似乎都被稱爲events方法。事件與delegateEvents之間的區別?

令我困惑的部分是密鑰應該在events散列內。

從文檔:

delegateEvents([events])使用jQuery的on功能 爲視圖內的DOM事件提供聲明回調。如果 events散列未直接傳遞,請使用this.events作爲源。 事件寫入格式{"event selector": "callback"}

但是從標準事件事件寫入不同:

var InputView = Backbone.View.extend({ 
    tagName: 'input', 

    events: { 
    "keydown" : "keyAction", 
    }, 

那麼如何都應該事件寫?你能結合這兩種語法嗎?

回答

2

delegateEvents是被調用來應用events視圖屬性的事件的視圖上的函數。

省略selector會導致事件綁定到視圖的根元素(this.el)。默認情況下,delegateEvents在視圖的構造函數中調用了 你,所以如果你有一個簡單的events散列,你所有的DOM事件總是會被連接,你不必自己調用這個函數。

這是setElement functionline 1273)內部發生:

setElement: function(element) { 
    this.undelegateEvents(); 
    this._setElement(element); 
    this.delegateEvents(); 
    return this; 
}, 

所以語法是相同的,兩者的語法著作。

var InputView = Backbone.View.extend({ 
    events: { 
    // keydown event from ".sub-element", which must be a child of the view's root 
    "keydown .sub-element" : "keyAction", 
    "keydown" : "keyAction", // keydown event from the root element 
    }, 
}); 

裏面的delegateEvents功能,key(例如"keydown .sub-element")使用正則表達式(line 1311)分開。

var match = key.match(delegateEventSplitter); 
this.delegate(match[1], match[2], _.bind(method, this)); 

正則表達式分裂從選擇器(line 1227)事件:(line 1317

// Cached regex to split keys for `delegate`. 
var delegateEventSplitter = /^(\S+)\s*(.*)$/; 

delegate功能:

// Add a single event listener to the view's element (or a child element 
// using `selector`). This only works for delegate-able events: not `focus`, 
// `blur`, and not `change`, `submit`, and `reset` in Internet Explorer. 
delegate: function(eventName, selector, listener) { 
    this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener); 
    return this; 
}, 
+0

什麼時候事件對象的鍵只有類似keydown的東西? – Jwan622

+0

@ Jwan622我更新了我的答案,並提供了更多細節。 –

+1

@ Jwan622閱讀所有'delegateEvents'文檔,「忽略'selector'導致事件綁定到視圖的根元素('this.el')。」部分尤其是相關的。 –

相關問題