Почему мои события CoffeeScript/backbone.js не срабатывают?
Я пытаюсь ознакомиться с CoffeeScript и backbone.js, и я должен что-то пропустить.
Этот CoffeeScript:
MyView = Backbone.View.extend
events: {
"click" : "testHandler"
}
testHandler: ->
console.log "click handled"
return false
view = new MyView {el: $('#test_container')}
view.render()
Создает следующий JavaScript:
(function() {
var MyView, view;
MyView = Backbone.View.extend({
events: {
"click": "testHandler"
},
testHandler: function() {
console.log("click handled");
return false;
}
});
view = new MyView({
el: $('#test_container')
});
view.render;
}).call(this);
Но событие click
не срабатывает testHandler
, когда я нажимаю test_container
.
Если я изменил вывод JavaScript на:
$(function() {
var MyView, view;
MyView = Backbone.View.extend({
events: {
"click": "testHandler"
},
testHandler: function() {
console.log("click handled");
return false;
}
});
view = new MyView({
el: $('#test_container')
});
view.render;
});
Удаляя call(this)
и добавляя $
, все работает так, как ожидалось. Что мне не хватает?
Ответы
Ответ 1
(function () {}).call(this);
- это просто способ немедленно вызвать анонимную функцию при указании получателя. Он работает в основном так же, как:
this.method = function () {};
this.method();
$(function () {})
, по крайней мере в jQuery, является сокращением для
$(document).ready(function () {})
который запускает заданную функцию, когда дерево DOM полностью построено. Похоже, это необходимое условие правильной работы вашей функции Backbone.View.extend
.
Ответ 2
Чтобы использовать CoffeeScript и jQuery вместе для сценариев приложений, поместите свой код в этот тип шаблона:
$ = jQuery
$ ->
MyView = Backbone.View.extend
events:
"click": "testHandler"
testHandler: ->
console.log "click handled"
false
view = new MyView el: $('#test_container')
view.render()
Ответ 3
Попробуйте использовать синтаксис объявления класса CoffeeScript, например:
class BacklogView extends Backbone.View
constructor: (@el) ->
this.delegateEvents this.events
events:
"click" : "addStory"
# callbacks
addStory: ->
console.log 'it works!'
Ответ 4
Что происходит, когда представление или, по крайней мере, view.el динамически генерируется? Вы можете вызвать метод view.delegateEvents(), чтобы вручную установить обработчики событий.
Здесь аналогичный coffeescript для рендеринга ChildView в ParentView, затем делегирования событий childView.
window.ParentView = Backbone.View.extend
addOne: (thing) ->
view = new ChildView({model: thing})
this.el.append view.render().el
view.delegateEvents()