Dokumentacja Backbone stwierdza:
Właściwość events można również zdefiniować jako funkcję zwracającą skrót zdarzenia, aby ułatwić programowe definiowanie zdarzeń, a także dziedziczenie ich z widoków nadrzędnych.
Jak możesz dziedziczyć zdarzenia widoku rodzica i rozszerzać je?
Widok rodzica
var ParentView = Backbone.View.extend({
events: {
'click': 'onclick'
}
});
Widok dziecka
var ChildView = ParentView.extend({
events: function(){
????
}
});
parentEvents = _.result(ParentView.prototype, 'events');
zamiast „ręcznego” sprawdzenia, czyevents
jest to funkcja._.result
, której wcześniej nie zauważyłem. Dla wszystkich zainteresowanych, oto jsfiddle z kilkoma wariacjami na ten temat: jsfiddlethis
brak wywoływania klasy nadrzędnej według nazwy instancji. Bardzo ci za to dziękuję.Żołnierz. Żółta odpowiedź jest dobra. Upraszczając to dalej, możesz po prostu wykonać następujące czynności
Następnie po prostu zdefiniuj zdarzenia w jednej z klas w typowy sposób.
źródło
this.events
& wParentView.prototype.events
przeciwnym razie, jeśli oba zdefiniują funkcje obsługi w tym samym zdarzeniu, funkcja obsługi Parent przesłoni funkcję elementu Child.{},ParentView.prototype.events,this.events
delegateEvents
jest wywoływane w konstruktorze do wiązania zdarzeń. Skoro więc ją przedłużaszinitialize
, dlaczego nie jest za późno?initialize
w kilku przypadkach (wtedy też będziesz musiał zajmować się zarządzaniem hierarchią tej funkcji) po prostu scal obiekty zdarzeń. Wydaje mi się czystsze, aby zachowaćevents
połączenie w sobie. To powiedziawszy, nie pomyślałbym o takim podejściu i zawsze miło jest być zmuszonym do spojrzenia na rzeczy w inny sposób :)Możesz również użyć tej
defaults
metody, aby uniknąć tworzenia pustego obiektu{}
.źródło
Jeśli używasz CoffeeScript i ustawisz funkcję na
events
, możesz użyćsuper
.źródło
Czy nie byłoby łatwiej stworzyć wyspecjalizowany konstruktor bazowy z Backbone.View, który obsługuje dziedziczenie zdarzeń w górę hierarchii.
Pozwala nam to zredukować (scalić) skróty zdarzeń w dół hierarchii za każdym razem, gdy tworzymy nową „podklasę” (konstruktor potomny) za pomocą przedefiniowanej funkcji rozszerzającej.
Tworząc wyspecjalizowany widok: BaseView, który redefiniuje funkcję rozszerzania, możemy mieć podwidoki (takie jak AppView, SectionView), które chcą dziedziczyć zadeklarowane zdarzenia ich widoku nadrzędnego, po prostu robią to, rozszerzając z BaseView lub jednej z jego pochodnych.
Unikamy potrzeby programistycznego definiowania naszych funkcji zdarzeń w naszych podglądzie, które w większości przypadków muszą jawnie odwoływać się do konstruktora nadrzędnego.
źródło
Krótka wersja ostatniej sugestii @ soldier.moth:
źródło
To również zadziała:
Używanie straight
super
nie działało dla mnie, albo ręcznie określałoParentView
albo dziedziczoną klasę.Dostęp do
_super
var, który jest dostępny w każdym skrypcieClass … extends …
źródło
http://danhough.com/blog/backbone-view-inheritance/
źródło
W przypadku wersji Backbone 1.2.3
__super__
działa dobrze, a nawet może być połączona łańcuchowo. Na przykład:... co - w
A_View.js
- spowoduje:źródło
W tym artykule znalazłem ciekawsze rozwiązania
Wykorzystuje super właściwości Backbone i hasOwnProperty ECMAScript. Drugi z jego postępowych przykładów działa jak urok. Oto fragment kodu:
Możesz to również zrobić dla interfejsu użytkownika i atrybutów .
W tym przykładzie nie uwzględniono właściwości ustawianych przez funkcję, ale autor artykułu oferuje rozwiązanie w takim przypadku.
źródło
Aby zrobić to całkowicie w klasie nadrzędnej i obsługiwać skrót zdarzeń oparty na funkcjach w klasie podrzędnej, aby dzieci mogły być agnostykami dziedziczenia (dziecko będzie musiało wywołać,
MyView.prototype.initialize
jeśli nadpisujeinitialize
):źródło
To rozwiązanie CoffeeScript zadziałało dla mnie (i uwzględnia sugestię @ soldier.moth):
źródło
Jeśli masz pewność, że
ParentView
zdarzenia są zdefiniowane jako obiekt i nie musisz definiować zdarzeń dynamicznieChildView
, można uprościć odpowiedź żołnierza. Motha dalej, pozbywając się funkcji i używając_.extend
bezpośrednio:źródło
Wzorzec, który mi się podoba, to modyfikacja konstruktora i dodanie dodatkowej funkcjonalności:
Wolę tę metodę, ponieważ nie musisz identyfikować zmiennej o jeden rodzic, aby ją zmienić. Używam tej samej logiki dla
attributes
idefaults
.źródło
Wow, wiele odpowiedzi tutaj, ale pomyślałem, że zaoferuję jeszcze jedną. Jeśli korzystasz z biblioteki BackSupport, oferuje
extend2
. Jeśliextend2
go używasz , automatycznie dba o scalanieevents
(a takżedefaults
i podobne właściwości) za Ciebie.Oto krótki przykład:
https://github.com/machineghost/BackSupport
źródło
extend2
) był najlepszym, jaki mogłem wymyślić, i nie sądzę, że to wszystko takie straszne: każdy przyzwyczajony do Backbone jest już przyzwyczajony do używaniaextend
, więc w ten sposób nie musi zapamiętywać nowego polecenia.