2012-02-02 9 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() 

Я не понимаю новую функцию? Может ли кто-нибудь объяснить, как это работает по-другому, чем я ожидал? Возможно, это просто мой синтаксис/значение JavaScript «это» во время определения, которое было обработано.

Я так привык делать это по-прежнему работает:

'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, вы увидите, что означает ChangeLog:.

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

Это _.isFunction вызов, что вы заинтересованы в Это означает, что вы можете сказать что-то вроде этого:

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

Таким образом, вы можете положить определенные функции (либо по их имени, если они доступные или как функциональные литералы) в таблице events поиска.

+1

Очень хорошо, спасибо. Единственное, что мне интересно в этот момент, заключается в том, будет ли каждая анонимная функция, определенная мной (например, «блины!» В вашем примере), будет иметь значение «this», ограниченное представлением, или если это будет какой бы то ни было целью это событие. Мне кажется, что эта строка обеспечит ее охват самому представлению: method = _.bind (метод, это); –

+2

@awcrud: строка 1078 (и этот пример: http://jsfiddle.net/ambiguous/JEavM/1/) указывают, что анонимная функция будет привязана к представлению. –