2012-06-13 11 views
5

Ich möchte nur ein Ereignis auslösen, wenn eine Eingabe den Wert mithilfe von jQuery 1.7.2 und Backbone.js ändert.Der Versuch, einen Rückruf durch Übergabe der Funktion zu binden, löst einen Fehler aus.

Zur Zeit habe ich die folgende (das funktioniert)

MyView: Backbone.View.extend({ 
    initialize: function() { 

    this.colorInput = $("<input />", { 
     "id": "color", 
     "name": "color", 
     "value": this.model.get("color") 
    }); 

    var self = this; 
    this.colorInput.on("change", function() { 
     self.changeColor(); 
    }); 

    }, 
    changeColor: function() { 
    var color = this.colorInput.val(); 
    this.model.set("color", color); 
    } 
}); 

Ich habe versucht, es in die andere Richtung zu tun, wo ich in meiner Funktion nur passieren.

this.colorInput.on("change", this.changeColor, this); 

Aber wenn man versucht, es so zu tun, wirft er den Fehler

((jQuery.event.special [handleObj.origType] || {}). handleObj || behandeln. Handler) .apply ist keine Funktion
.apply (matched.elem, args);

(line 3332)

Was ich nicht in der Lage bin, um herauszufinden. Irgendwelche Ideen, warum dieser Weg nicht funktioniert?

Antwort

11

Du verwechselst jQuery's on:

.on (Ereignisse [Selektor] [Daten], Handler (event))
.on (events-Karte [Selektor] [ , Daten])

mit Backbone's on:

object.on (event, Rückruf, [context])

Backbone des einen Kontext als drittes Argument macht, macht jQuery nicht. Sieht aus, als ob jQuerys on Ihr drittes Argument als handler(eventObject) interpretiert und versucht, es wie eine Funktion zu bezeichnen, die die angezeigte Fehlermeldung erklären würde.

Normalerweise würden Sie es tun, wie folgt:

MyView: Backbone.View.extend({ 
    events: { 
    'change input': 'changeColor' 
    }, 
    initialize: function() { 
    this.colorInput = $("<input />", { 
     "id": "color", 
     "name": "color", 
     "value": this.model.get("color") 
    }); 
    }, 
    render: function() { 
    this.$el.append(this.colorInput); 
    return this; 
    }, 
    changeColor: function() { 
    var color = this.colorInput.val(); 
    this.model.set("color", color); 
    } 
}); 

und Backbone Veranstaltung Delegation System kümmern Dinge lassen.

+0

+1, Ja, gleiche Meinung hier. Ich habe auch Probleme, ein funktionierendes Beispiel zu haben, das _onlive created_ DOM-Element löst kein Change-Ereignis aus, ich gab auf, weil es kein Problem in Bezug auf die Frage war. – fguillen

+0

check my edit, falls ich falsch liege – fguillen

+1

@fguilllen: Ich habe die Bearbeitung halbiert, ich denke '.on' macht ein [' isPlainObject'] (http://api.jquery.com/jQuery.isPlainObject /) Überprüfen Sie das erste Argument, um zu wählen, welche Form es verwendet, das erste Argument ist keine Ereignis-Map, also geht es mit der ersten Form von '.on' und wir versuchen wieder, ein View-Objekt wie a aufzurufen Funktion. Haben Sie das Problem "Änderung wird nicht ausgelöst, bis sich der Fokus ändert"? –

3

Dies ist für die Googler, die auf dieses Problem stoßen. Ich hatte genau das gleiche Problem und was passiert ist, war das, wo der Fehler gemeldet wurde und wo der Fehler tatsächlich aufgetreten ist, waren an zwei verschiedenen Orten.

eine Zeile Code war veraltet und sah so etwas wie

$('#modal').on('click', function(e) { 
    // Execute invalid code here. 
}); 

Die andere Zeile Code ähnlich war:

$('#modal').on('click', function(e) { 
    // Execute valid code here. 
}); 

Der Fehler war, dass der erste Aufruf war keine echte Funktion, so der Fehler war korrekt, der zweite Handler, der aufgerufen wurde, war keine echte Funktion und jQuery konnte ihn nicht abschließen, aber er handelte immer so, als wäre er beim zweiten Funktionsaufruf aufgetreten.

Ich würde sagen, wenn Sie diesen Fehler auftreten, entfernen Sie alle zusätzlichen Ereignishandler, die ausgelöst werden können, und sehen, ob das das Problem stoppt.