2012-02-02 44 views
7

的骨幹0.9.0更新日誌說:新的Backbone View'events'哈希如何在0.9.0版本中使用函數值而不是字符串?

視圖的事件哈希現在可能還包含直接函數值 以及現有觀點方法字符串名稱。

當我嘗試以下它失敗,說事件的值是undefined

var BB = Backbone.View.extend({ 
    'initialize': function() { 

    this.$el.html('<input type="button" value="Click me!" />'); 
    jQuery('body').html(this.el); 
    }, 

    'events': { 
    'click input[type="button"]': this.buttonClicked 
    }, 

    'buttonClicked': function() { 
    alert('button clicked!'); 
    } 

}); 

window.b = new BB() 

我誤解了新功能嗎?有人可以解釋它的工作方式與我預期的不同嗎?也許這只是我定義的'this'的JavaScript語法/值爲borked。

我已經習慣了還在做它的工作方式:

'events': { 
    'click input[type="button"]': 'buttonClicked' 
}, 

回答

14

當JavaScript分析器送過來:

'events': { 
    'click input[type="button"]': this.buttonClicked 
}, 

this可能window,而不是像您期望的BB實例。該window對象不具有buttonClicked特性(至少它不會在你的情況),所以你真的這樣說:

'events': { 
    'click input[type="button"]': undefined 
}, 

,並有你的錯誤。

如果你看看來源爲delegateEvents,你會看到什麼樣的更新日誌是指:

delegateEvents: function(events) { 
    // ... 
    for (var key in events) { 
    var method = events[key]; 
    if (!_.isFunction(method)) method = this[events[key]]; 
    // ... 
    } 
}, 

_.isFunction電話是你有興趣這意味着,你可以說這樣的事情:在events查找表

events: { 
    'click input[type="button"]': function() { alert('pancakes!') }, 
    'click button': some_function_that_is_in_scope 
} 

所以你可以把定義函數(或者通過,如果他們訪問或函數字面他們的名字)。

+1

非常好,謝謝。我現在唯一想知道的是,我定義的每個匿名函數(例如您的示例中的'pancakes!')是否將其'this'的值賦給視圖,或者它是否會成爲目標事件是。在我看來,這一行將確保它的作用域爲View本身:method = _.bind(method,this); – 2012-02-02 19:42:11

+2

@awcrud:第1078行(以及本示例:http://jsfiddle.net/ambiguous/JEavM/1/)表示匿名函數的作用域將被視爲該視圖。 – 2012-02-02 20:15:39

相關問題