2012-06-13 21 views
5

我只想在輸入使用jQuery 1.7.2和Backbone.js更改值時觸發事件。試圖通過傳遞函數來綁定回調會引發錯誤

目前,我有以下(工作)

MyView: Backbone.View.extend({ 
    initialize: function() { 

    this.colorInput = $("<input />", { 
     "id": "color", 
     "name": "color", 
     "value": this.model.get("color") 
    }); 

    var self = this; 
    this.colorInput.on("change", function() { 
     self.changeColor(); 
    }); 

    }, 
    changeColor: function() { 
    var color = this.colorInput.val(); 
    this.model.set("color", color); 
    } 
}); 

我試圖做它的其他方式,我只是通過我的功能。

this.colorInput.on("change", this.changeColor, this); 

但是,試圖這樣做時,這種方式,它拋出

((jQuery.event.special [handleObj.origType] || {})。處理|| handleObj錯誤。處理程序).apply不是函數
.apply(matched.elem,args);

line 3332

這我無法弄清楚。任何想法爲什麼這種方式不起作用?

回答

11

你混淆jQuery's on

。對(事件[,選擇] [數據],處理器(eventObject)傳遞)
。對(事件地圖[,選擇] [ ,數據])

Backbone's on

object.on(事件,回調,[上下文])

骨幹的獲取上下文作爲第三個參數,jQuery的沒有。看起來jQuery的on正在將你的第三個參數解釋爲handler(eventObject),並試圖將其稱爲一個函數,這將解釋您所看到的錯誤消息。

通常你會做更是這樣的:

MyView: Backbone.View.extend({ 
    events: { 
    'change input': 'changeColor' 
    }, 
    initialize: function() { 
    this.colorInput = $("<input />", { 
     "id": "color", 
     "name": "color", 
     "value": this.model.get("color") 
    }); 
    }, 
    render: function() { 
    this.$el.append(this.colorInput); 
    return this; 
    }, 
    changeColor: function() { 
    var color = this.colorInput.val(); 
    this.model.set("color", color); 
    } 
}); 

,讓骨幹事件代表團系統處理後事。

+0

+1,是的,這裏的意見相同。我也有問題需要一個工作示例,_onlive created_ DOM元素不會觸發'change'事件,我放棄了,因爲它不是與問題有關的問題。 – fguillen

+0

檢查我的編輯,以防萬一我錯了 – fguillen

+1

@fguillen:我半解開了編輯,我想'.on'正在做一個['isPlainObject'](http://api.jquery.com/jQuery.isPlainObject /)檢查其第一個參數以選擇使用哪種形式,第一個參數不是事件映射,因此它與第一種形式的「.on」一起使用,然後我們又試圖調用視圖對象,如功能。你有沒有「改變不會觸發,直到焦點改變」的問題? –

3

這是針對遇到此問題的Google員工。我有這個完全相同的問題,發生了什麼錯誤報告和實際發生錯誤的地方是在兩個不同的地方。代碼

一號線已經過時,看起來有點像

$('#modal').on('click', function(e) { 
    // Execute invalid code here. 
}); 

的代碼的其他行相似:

$('#modal').on('click', function(e) { 
    // Execute valid code here. 
}); 

的錯誤是第一次調用是不是一個真正的功能,所以錯誤是準確的,被調用的第二個處理程序不是一個真正的函數,jQuery無法完成它,但它總是充當它發生在第二個函數調用中。

我想說,如果遇到這個錯誤,請刪除任何可能觸發的額外事件處理程序,看看是否能夠解決問題。