2011-11-29 13 views
12

Tworzę aplikację w Backbone.js, która ma widoki nadrzędne i wiele podrzędnych. Widoki podrzędne zawierają odsyłacze, których słuchają i wykonują funkcję.Dlaczego zdarzenia nie są uruchamiane po drugim renderowaniu w Backbone.js?

Element nadrzędny przechowuje listę wszystkich widoków podrzędnych. W funkcji renderowania, po to się robi obliczeniowej własny html, to wykonuje następujące operacje:


$(this.el).html(html); 
for (var i = 0; i < this.views.length; i++){ 
    $('.children', this.el).append(this.views[i].render().el); 
} 

Odpowiedź: Problemem było to, że było stworzenie odnośnik podczas renderowania. To znaczy. na pierwszym renderowaniu (który został wywołany z init) zdarzenie powiodło się z linkiem. Ponieważ jednak wszystkie następne wywołania renderowania odtwarzają cały element, nowy odsyłacz nie ma powiązania z nim. Zostało to rozwiązane poprzez rozwiązanie @Tom Tu dodawania this.delegateEvents() do renderowania

Odpowiedz

13

Prawdopodobnie używasz jQuery remove funkcję gdzieś usunąć subviews z widoku - automatycznie usuwa wszystkie zdarzenia związane z elementem (this.el) - ustaw w obiekcie events. Możesz użyć metody this.delegateEvents() w renderowaniu subviews po wyrenderowaniu szablonu, aby ponownie powiązać obiekty delegowane ustawione w obiekcie events lub zamiast tego użyć metody jquery detach w celu usunięcia elementów z DOM bez usuwania powiązania zdarzeń (link). Metoda delegateEvents jest dość kosztowna i dlatego polecam metodę detach usuwania elementów, które chcesz ponownie wykorzystać, jeśli renderujesz długie listy subskrybentów - nieistotne, jeśli jest to tylko kilka widoków.

Inna możliwość polega na tym, że źle ustawiłeś obiekt events - trudno powiedzieć z podanego kodu, ale postawiłem na pierwszy.

+0

dodaje nieco więcej szczegółów, nadzieję, że pomoże –

+0

że jest naprawdę dobra myśl, ale dodałem usuń kod powyżej. Również zdarzenia nie mogą być ustawione źle, lub nie byłoby ognia w pierwszej kolejności. – chacham15

7

Prawdziwe wspólne wyzwanie. Dla przyszłych poszukiwaczy tego pytania, oto świetny artykuł na temat renderowania widoku:

Trzeba tylko upewnić się, że delegateEvents jest wezwany do ponownego powiązania zdarzeń w swoich subviewsach w każdym momencie .html() działa. A ponieważ setElement szkieletowej za wywołuje już delegateEvents, szybkie rozwiązanie mogłoby wyglądać tak ...

http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/

+0

Tego właśnie szukałem. Dzięki! –

Powiązane problemy