2012-04-03 8 views
5

Ich habe Backbone-Ansicht, die eine Aktion an ein Element im DOM bindet. Das Problem ist, dass das DOM-Element beim Aufruf der Ereignisse nicht gerendert wurde. Mein Code sieht wie folgt aus:Wie binden Sie Ereignisse nach der Initialisierungsfunktion im Backbone an das DOM?

// Change the focus to a full goal view 
    var GoalFullView = Backbone.View.extend({ 

    // Bind the goal full view 
    el: $("#main"), 

    // Events for making changes to the goal 
    events: { 
     "keypress #goal-update": "createOnEnter", 
    }, 

    // Cache the template for the goal full view 
    template: _.template($("#goal-full-template").html()), 

    // Render the goal full and all of its goal updates 
    initialize: function() { 
     this.render(); 
     this.collection = new GoalUpdateList; 
     this.collection.bind('add', this.addOne, this); 
     this.collection.bind('reset', this.addAll, this); 

     this.collection.fetch(); 
    }, 

Wie Sie sehen können, die Ereignisbindung auftritt, bevor die Initialisierung, damit es nicht das DOM-Element finden kann, weil es nicht erbracht wurde. Wie kann ich die Ereignisbindung bis nach der Initialisierung verzögern?

Edit 1: Hmm, ich habe ein Konsolenprotokoll, und druckt es auf einem Tastendruck etwas aus, aber ich bin immer diese Nachricht in meiner Chrome-Entwicklerkonsole:

Uncaught TypeError: Cannot call method 'apply' of undefined 

Was bedeutet das?

+0

binden nur die Ereignisse in der Initialisierungsfunktion. oder verwenden Sie die Delegation. Binden Sie das Ereignis an ein Elternelement und testen Sie im Ereignisrückruf, welches Element das Ereignis ausgelöst hat. – mpm

+0

Ich denke, ich benutze diesen Ansatz die ganze Zeit und ich habe kein Problem .. lass mich überprüfen. – fguillen

+0

Ich erinnere mich nicht Ereignis mit dem Namen "Tastendruck", aber ich erinnere mich an "keyup". könnte das das problem sein? (übrigens, liebe deinen Benutzernamen :) –

Antwort

3

Wie ich erwartet habe, ist das Problem an einem anderen Ort.

Die Bindungsdeklaration DOM events kann ausgeführt werden, bevor das DOM-Element real existiert.

Ich denke, dieses Codebeispiel reproduziert die Situation, die Sie sprechen, und immer noch ist das DOM event korrekt gebunden.

var View = Backbone.View.extend({ 
    events: { 
    "click #link": "click" 
    }, 

    click: function(){ 
    console.log("click event"); 
    }, 

    render: function(){ 
    this.$el.html("<a href='#' id='link' onclick='return false'>link</a>"); 
    } 
}); 

new View({ el: "body" }).render();​ 

Überprüfen Sie die jsfiddle example code

+0

Das funktioniert, aber ich hatte genau das gleiche Problem wie in der Post beschrieben, was ich erwarten würde zu arbeiten. Es spielt keine Rolle, ob ich 'this.el' in der Initialisierungsmethode deklariere. –

Verwandte Themen