2010-11-05 5 views
10

Я пытаюсь ознакомиться с 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) и прилагая $, все работает, как ожидалось. Что мне не хватает?

+0

Похоже, вы используете JQuery. Вы хотите добавить тег jQuery? – Angiosperm

ответ

7
(function() {}).call(this); 

- это всего лишь способ немедленно вызвать анонимную функцию при указании приемника. Он работает в основном это точно так же, как:

this.method = function() {}; 
this.method(); 

$(function() {}), по крайней мере, в JQuery, представляет собой сокращенную

$(document).ready(function() {}) 

который запускает данную функцию, когда дерево DOM была полностью построена. Похоже, это необходимое условие правильной работы вашей функции Backbone.View.extend.

+0

Ahh ok thanks, и все это время я думал (function() {}). Call (this) был таким же, как $ (function() {}). Теперь имеет смысл. – sefner

5

Для использования CoffeeScript и JQuery вместе для сценариев приложений, поместить свой код в этом виде шаблона:

$ = jQuery 
$ -> 

    MyView = Backbone.View.extend 
    events: 
     "click": "testHandler" 
    testHandler: -> 
     console.log "click handled" 
     false 

    view = new MyView el: $('#test_container') 
    view.render() 
2

Что происходит, когда вид или, по крайней мере, 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() 
3

Попробуйте использовать класс CoffeeScript декларации синтаксис и т.д .:

class BacklogView extends Backbone.View 
    constructor: (@el) -> 
    this.delegateEvents this.events 

    events: 
    "click" : "addStory" 

    # callbacks 
    addStory: -> 
    console.log 'it works!' 
+0

Я нашел лучшее решение через некоторое время .. и сегодня StackOverflow напомнил о себе (я заработал какой-то значок :) Так что лучшим решением является вызов супер в самой первой строке тела метода конструктора и отказ от вызова this.delegateEvents , Удачи;) – alecnmk

+0

с конструктором, как в вашем примере с super(), поскольку первая строка работала для меня. –