In der Dokumentation von Backbone heißt es:
Die Ereigniseigenschaft kann auch als eine Funktion definiert werden, die einen Ereignis-Hash zurückgibt, um das programmgesteuerte Definieren Ihrer Ereignisse sowie das Erben dieser Ereignisse von übergeordneten Ansichten zu vereinfachen.
Wie erben Sie die Ansichtsereignisse eines Elternteils und erweitern sie?
Übergeordnete Ansicht
var ParentView = Backbone.View.extend({
events: {
'click': 'onclick'
}
});
Untergeordnete Ansicht
var ChildView = ParentView.extend({
events: function(){
????
}
});
parentEvents = _.result(ParentView.prototype, 'events');
anstelle von 'manuell' zu prüfen, obevents
es sich um eine Funktion handelt._.result
, die ich vorher nicht bemerkt hatte. Für alle, die interessiert sind, hier ist eine jsfiddle mit einer Reihe von Variationen zu diesem Thema: jsfiddlethis
darin, die übergeordnete Klasse nicht nach dem Instanznamen aufrufen zu müssen. Vielen Dank dafür.Die Antwort von soldat.moth ist gut. Wenn Sie es weiter vereinfachen, können Sie einfach Folgendes tun
Definieren Sie dann einfach Ihre Ereignisse in beiden Klassen auf typische Weise.
quelle
this.events
undParentView.prototype.events
ansonsten, wenn beide Handler für dasselbe Ereignis definieren, überschreibt der Handler des Elternteils den des Kindes.{},ParentView.prototype.events,this.events
delegateEvents
wird es im Konstruktor aufgerufen, Ereignisse zu binden.initialize
Wie kommt es, dass es nicht zu spät ist, wenn Sie es im verlängern ?initialize
in einigen Fällen schreiben (dann müssen Sie sich auch mit der Verwaltung der Hierarchie dieser Funktion befassen), um einfach Führen Sie die Ereignisobjekte zusammen. Scheint mir sauberer, dieevents
Verschmelzung in sich zu behalten .Sie können die
defaults
Methode auch verwenden , um das Erstellen des leeren Objekts zu vermeiden{}
.quelle
Wenn Sie CoffeeScript verwenden und eine Funktion auf setzen
events
, können Sie verwendensuper
.quelle
Wäre es nicht einfacher, einen speziellen Basiskonstruktor aus Backbone.View zu erstellen, der die Vererbung von Ereignissen in der Hierarchie behandelt?
Auf diese Weise können wir den Ereignis-Hash in der Hierarchie reduzieren (zusammenführen), wenn wir mithilfe der neu definierten Erweiterungsfunktion eine neue Unterklasse (untergeordneten Konstruktor) erstellen.
Durch Erstellen einer speziellen Ansicht: BaseView, die die Erweiterungsfunktion neu definiert, können Unteransichten (wie AppView, SectionView) vorhanden sein, die die deklarierten Ereignisse ihrer übergeordneten Ansicht erben möchten. Dies geschieht einfach durch Erweitern von BaseView oder einer ihrer Ableitungen.
Wir vermeiden die Notwendigkeit, unsere Ereignisfunktionen programmgesteuert in unseren Unteransichten zu definieren, die in den meisten Fällen explizit auf den übergeordneten Konstruktor verweisen müssen.
quelle
Kurzversion des letzten Vorschlags von @ sold.moth:
quelle
Dies würde auch funktionieren:
Die Verwendung von Straight
super
funktionierte bei mir nicht und spezifizierte das auch manuellParentView
oder die geerbte Klasse .Zugriff auf die
_super
Var, die in jedem Coffeescript verfügbar istClass … extends …
quelle
http://danhough.com/blog/backbone-view-inheritance/
quelle
Für Backbone Version 1.2.3
__super__
funktioniert es einwandfrei und kann sogar verkettet sein. Z.B:... was - in
A_View.js
- führt zu:quelle
Ich habe hier eine interessantere Lösung gefunden Artikel
Einzelheiten hierzu sind im Backbone des Super und ECMAScript des hasOwnProperty. Das zweite seiner progressiven Beispiele wirkt wie ein Zauber. Hier ist ein bisschen ein Code:
Sie können dies auch für Benutzeroberflächen und Attribute tun .
In diesem Beispiel werden die von einer Funktion festgelegten Eigenschaften nicht berücksichtigt, aber der Autor des Artikels bietet in diesem Fall eine Lösung an.
quelle
Um dies vollständig in der übergeordneten Klasse zu tun und einen funktionsbasierten Ereignis-Hash in der untergeordneten Klasse zu unterstützen, damit Kinder unabhängig von der Vererbung sein können (das Kind muss aufrufen,
MyView.prototype.initialize
wenn es überschreibtinitialize
):quelle
Diese CoffeeScript-Lösung hat bei mir funktioniert (und berücksichtigt den Vorschlag von @ sold.moth):
quelle
Wenn Sie sicher sind, dass die
ParentView
Ereignisse als Objekt definiert sind und Sie Ereignisse nicht dynamisch definieren müssen,ChildView
können Sie die Antwort von sold.moth weiter vereinfachen, indem Sie die Funktion entfernen und_.extend
direkt verwenden:quelle
Ein Muster dafür, das mir gefällt, ist das Ändern des Konstruktors und das Hinzufügen einiger zusätzlicher Funktionen:
Ich bevorzuge diese Methode, weil Sie die übergeordnete Variable nicht identifizieren müssen, um sie zu ändern. Ich benutze die gleiche Logik für
attributes
unddefaults
.quelle
Wow, viele Antworten hier, aber ich dachte, ich würde noch eine anbieten. Wenn Sie die BackSupport-Bibliothek verwenden, bietet sie
extend2
. Wenn Sie es verwendenextend2
, kümmert es sich automatisch um das Zusammenführenevents
(sowiedefaults
ähnliche Eigenschaften) für Sie.Hier ist ein kurzes Beispiel:
https://github.com/machineghost/BackSupport
quelle
extend2
) war das Beste, was ich mir vorstellen konnte, und ich denke nicht, dass es so schrecklich ist: Jeder, der an Backbone gewöhnt ist, ist bereits daran gewöhntextend
, so dass er sich auf diese Weise keinen neuen Befehl merken muss.