2011-10-12 14 views
18

Mam klasę podstawową dla wszystkich widoków, a następnie w każdej sekcji aplikacji, podobnie jak profile, również mam klasę podstawową. W ten sposób udostępnione szablony i właściwości mogą być używane w całej mojej aplikacji na wielu poziomach.Automatyczne przedłużanie zdarzenia z widoku podstawowego

Wiem, że jeśli uczynisz właściwość zdarzenia w widoku szkieletu funkcji zamiast literału obiektu, zostanie utworzona dla ciebie instancja, ale nie jestem pewien, jak wykorzystać to na swoją korzyść. Moje pytanie brzmi: jaki jest najlepszy sposób automatycznego przedłużania wydarzeń utworzonych w widoku podstawowym.

Znam jedną z możliwości, w której podczas inicjowania widoku pobieżę podstawową klasę zdarzeń i przedłużam na nią bieżące wydarzenie, ale wydaje mi się ona nieco zjadliwa i musiałbym ją skopiować w każdym widoku. Jeśli znasz lepszy sposób, udostępnij.

Dzięki.

+0

Można zajrzeć do tych stanowisk/linków (ewentualne duplikaty): http://stackoverflow.com/questions/6257405/backbone -js-view-inheritence-this-resolution-in-parent Kolejne: http://stackoverflow.com/questions/6968487/sub-class-a-backbone-view-sub-class-retain-events Strona zewnętrzna: http: //kalimotxocoding.blogspot.com/2011/03/playing-with-backbonejs-views.html – PhD

+0

Cześć Nupal, bardzo ważna odpowiedź i dzięki za zrobienie lepszego sprawdzenia, to zrobiłem. Dwa łącza do stackoverflow, które wysłałeś, zawierały jedną dobrą odpowiedź, która różniła się od tej przedstawionej poniżej. Dodam je tam i sprawię, że będzie to ostateczne źródło tego konkretnego pytania (pozostałe pytania są szersze). Dodatkowo, wpis blogu kalimotxocoding.blogspot.com jest po prostu okropny, wymaga hakowania rdzenia backbone.js i tak naprawdę niczego nie rozwiązuje. Doceniam twój wkład. –

Odpowiedz

35
var ParentView = Backbone.View.extend({ 
    'events': { 
     'click .parent-something': "onParentSomethingClick" 
    } 
}); 

var ChildView = ParentView.extend({ 
    'events': _.extend({ 
     'click .something': 'onSomethingClick', 
    }, ParentView.prototype.events) 
}); 

To nic nie robi, ale to najprostszy sposób, jaki widziałem do tej pory.
Ja również stworzył istotę na innej drodze Używam: https://gist.github.com/1271041

+1

Funkcja "nadrzędna" podana przez link github jest niesamowita. Zdecydowanie zastępuję moją wyższą implementację currrent twoją. Dzięki!! – threejeez

+2

Czy nie chcesz przekazać swoich obiektów do _.extend() na odwrót? np. Klon następnie nadpisuje zdarzenia superklasy za pomocą nowych wydarzeń? W ten sposób można nadpisać super funkcjonalność dzięki funkcji podrzędnej, bardziej znanemu podejściu do dziedziczenia. – WildService

6

Oto jak przedłużyć wydarzenia widoku nadrzędnego moim zdaniem dzieci:

var ParentView = Backbone.View.extend({ 

     events: { 
      'click .link': 'onLinkClick' 
     } 
}); 

var ChildView = ParentView.extend({ 

     events: function(){ 
      return _.extend({ 
       'click .something': 'onSomethingClick', 
      }, this.constructor.__super__.events); 
     } 
}); 

Uwaga: To działa tylko jako szkieletu 0.5.3. Przed tą wersją nie można było zdefiniować zdarzeń jako funkcji.

+0

Dzięki JohnnyO. Słyszałem o niestandardowym, ale wszechobecnym '__proto__', ale nigdy nie słyszałem o' __super__' w JavaScript. Czy jest to dodatek do Backbone core, czy jest to nowość w nowoczesnych przeglądarkach? –

+1

__super__ jest dodawany przez rdzeń Backbone i mapuje do prototypu odziedziczonej klasy. –

+0

Rockin '. Dzięki JohnnyO. –

2

Wierzę, że odpowiedź JohnnyO jest najlepsza. Jednak natrafiłem na dwa inne sposoby robienia tego i wkleję je tutaj.

Szkoda, że ​​nie ma "automatycznego" rozwiązania, które nie wymaga dodatkowego kodu napisanego ręcznie w każdym nowym widoku, ale takie właśnie jest.

ChildView = ParentView.extend({ 
    name: 'ChildView', 
    events: { 
    }, 
    constructor: function(){ 
     this.events = _.extend({}, ParentView.prototype.events, this.events); 
     console.debug(this.events); 
     ParentView.prototype.constructor.apply(this, arguments); 
    }, 
    someFunc: function(){ 
     console.debug('someFunc; this.name=%s', this.name); 
    } 
}); 

przez Paula - backbone.js view inheritence. `this` resolution in parent

ja nie wiedziałem, że można zapewnić konstruktora w Backbone.view.extend. Dobrze wiedzieć.

var GenericView = Backbone.View.extend({ 

    genericEvents: { 'click .close': 'close' }, 

    close: function() { console.log('closing view...'); } 

}); 

var ImplView = GenericView.extend({ 

    events: { 'click .submit': 'submit' }, 

    initialize: function(options) { 
    // done like this so that genericEvents don't overwrite any events 
    // we've defined here (in case they share the same key) 
    this.events = _.extend(this.genericEvents, this.events); 
    this.delegateEvents() 
    } 
}); 

Przez rulfzid - Sub Class a Backbone.View Sub Class & retain events

ja już sobie wyobrazić (i spadła) to podejście, ale ten ma dodatkowy skręt dzwoniąc do czegoś innego zdarzenia bazową tak, że „genericEvents nie nadpisać żadnych wydarzeń” jak mówi autor. Chyba że mówi o jakimś mungingu obu zdarzeń, które przechodzisz wewnątrz obiektu obu wydarzeń, nie jestem pewien, o czym mówi, po prostu użyłbym prototypu lub prototypu, by odwoływać się do wydarzeń nadrzędnych. Ale znowu, dobrze wiedzieć.

+1

Możesz wstawiać '_.extend ({}, ParentView.prototype.events, {'click': 'close'})' bezpośrednio w definicji ChildView. Nie trzeba wtedy konstruktora. –

Powiązane problemy