2010-11-05 6 views
10

Sto cercando di familiarizzare con CoffeeScript e backbone.js e mi manca qualcosa.Perché i miei eventi CoffeeScript/backbone.js non vengono attivati?

Questo CoffeeScript:

MyView = Backbone.View.extend 
    events: { 
    "click" : "testHandler" 
    } 

    testHandler: -> 
    console.log "click handled" 
    return false 

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

genera il seguente 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); 

Ma l'evento non si attiva clicktestHandler quando scatto in test_container.

Se cambio l'output Javascript per:

$(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; 
}); 

Rimozione del call(this) e aggiungendo il $, tutto funziona come previsto. Cosa mi manca?

+0

Sembra che si sta utilizzando jQuery. Vuoi aggiungere il tag jQuery? – Angiosperm

risposta

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

è solo un modo per richiamare immediatamente una funzione anonima mentre si specifica un destinatario. Funziona praticamente questo stesso modo:

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

$(function() {}), almeno in jQuery, è una scorciatoia per

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

che gestisce la funzione data quando l'albero DOM è stato completamente costruito. Sembra che questa sia la condizione necessaria affinché la tua funzione Backbone.View.extend funzioni correttamente.

+0

Ahh ok grazie, e per tutto questo tempo stavo pensando (function() {}). Call (this) era uguale a $ (function() {}). Ha molto più senso ora. – sefner

5

Per utilizzare CoffeeScript e jQuery insieme per gli script di applicazione, inserire il codice in questo tipo di modello:

$ = jQuery 
$ -> 

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

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

Cosa succede quando la vista, o almeno view.el viene generata dinamicamente? È possibile chiamare il metodo view.delegateEvents() per impostare manualmente gli eventhandler.

Ecco un coffeescript simile per il rendering di ChildView in un ParentView, quindi delega degli eventi di childView.

window.ParentView = Backbone.View.extend 
    addOne: (thing) -> 
    view = new ChildView({model: thing}) 
    this.el.append view.render().el 
    view.delegateEvents() 
3

Prova utilizzando la sintassi dichiarazione di classe CoffeeScript, ad es .:

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

    events: 
    "click" : "addStory" 

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

Ho trovato una soluzione migliore qualche tempo dopo .. e oggi StackOverflow ha ricordato a se stesso (ho guadagnato qualche distintivo :) Quindi la soluzione migliore è chiamare super nella prima riga del corpo del metodo del costruttore e abbandonare la chiamata a this.delegateEvents . Buona fortuna;) – alecnmk

+0

avere il costruttore come nel tuo esempio con super() come la prima linea ha funzionato per me. –