2012-05-24 11 views
10

Ist es eine schlechte Praxis, undelegateEvents() in der Ansicht remove() Methode aufzurufen? Warum war es nicht standardmäßig von den Backbone-Jungs enthalten?Der beste Weg, um Ereignisse zu enthüllen, sobald eine Ansicht nicht mehr benötigt wird

Ich erkannte, dass ich in so viele bindende Probleme verlaufe, wenn ich einfach eine Ansichtsvariable reinitialisiere. Obwohl undelegateEvents() automatisch aufgerufen wird, wenn eine neue Ansicht erstellt wird, versucht es, Ereignisse für die neu instanziierte Ansicht und nicht die vorherige wieder zu entfernen. Aus diesem Grund bleiben Ghost-Event-Callbacks erhalten, wenn sie nicht jedes Mal manuell aufgerufen werden.

Was ist der beste Weg, damit umzugehen?

+0

verwandt? http://stackoverflow.com/questions/10429648/backbone-js-how-to-unbind-from-events-on-model-remove/10433015#10433015 – fguillen

+0

Verwenden Sie ein 'el' beim Wechseln der Ansichten und nicht erneut neue schaffen? Der jQuery 'delegate' ist an den' el' der Ansicht gebunden. –

+0

@muistooshort Ja, ich benutze oft den gleichen DOM-Container, und gebe es der Ansicht, anstatt ein neues zu erstellen und anzuhängen. Aus diesem Grund ist das Entfernen der Ghost-Callbacks von entscheidender Bedeutung. – preslavrachev

Antwort

5

Ist es eine schlechte Praxis, undelegateEvents() in der Ansicht remove() Methode aufzurufen?

Es ist nicht notwendig, wenn Sie Ihre eigene remove() sind Implementierung und Sie rufen Sie nicht Backbone.View.remove() oder this.$el.remove(). Das ist, wenn Sie mindestens jQuery verwenden. Der Aufruf von remove() in einer Backbone-Ansicht ruft jQuery.remove() auf, wodurch alle DOM-Ereignis-Listener trotzdem entfernt werden.

Ich erkannte, dass ich in so viele bindende Probleme verfallen bin, wenn ich einfach eine Ansichtsvariable reinitialisiere.

scheinen Viele Leute Backbone.Events zu verwenden, wie es irgendeine Art von Magie, die sie nicht brauchen, um aufzuräumen nach, zum Beispiel: meine Antwort

var View = Backbone.View.extend({ 

    initialize : function (options) { 

    // `on()` or `bind()` 

    this.model.on('something', this.render, this); 

    } 

}); 

Siehe auf Delegating events to a parent view in Backbone

Ist es möglich, dass die Ghost-Event-Probleme bei Backbone-Events und nicht bei DOM-Events auftreten?

Wenn Sie das Modellobjekt in der Nähe haben, aber dieses Objekt oder seine Backbone-Ereignisregistrierungen entfernen möchten, müssen Sie view.model.off(null, null, this); tun. Sie müssen die Ereignisse lösen, die Sie für externe Objekte registriert haben. Wenn Sie möchten, können Sie Backbone.View.remove() überschreiben und tun Sie es dort, aber standardmäßig ist diese Methode nur Kurzschrift für view.$el.remove().

Verwandte Themen