Obecnie próbuję zaimplementować metodę niszczenia / usuwania dla widoków, ale nie mogę uzyskać ogólnego rozwiązania działającego dla wszystkich moich widoków.
Miałem nadzieję, że będzie zdarzenie do dołączenia do kontrolera, tak aby nowe żądanie niszczyło poprzednie widoki, a następnie ładowało nowe.
Czy można to zrobić bez konieczności tworzenia funkcji usuwania dla każdego widoku?
javascript
javascript-events
backbone.js
Ad Taylor
źródło
źródło
Odpowiedzi:
Nie znając wszystkich informacji ... Możesz powiązać wyzwalacz resetowania z modelem lub kontrolerem:
this.bind("reset", this.updateView);
a kiedy chcesz zresetować widoki, wyzwalaj reset.
Aby oddzwonić, zrób coś takiego:
updateView: function() { view.remove(); view.render(); };
źródło
this.remove()
połączeniathis.stopListening()
ithis.$el.remove()
. Pierwsza usuwa wszystkie detektory zdarzeń dodane za pomocąthis.listenTo(...)
. Druga usuwa wszystkie detektory zdarzeń dodane przy użyciu jQuery. Pomiędzy tymi dwoma, powinieneś zostać objęty, chyba że użyłeś innych sposobów dodawania detektorów zdarzeń. Więc ta odpowiedź jest poprawna i daje mi +1.Musiałem być absolutnie pewien, że widok został nie tylko usunięty z DOM, ale także całkowicie niezwiązany z wydarzeniami.
destroy_view: function() { // COMPLETELY UNBIND THE VIEW this.undelegateEvents(); this.$el.removeData().unbind(); // Remove view from DOM this.remove(); Backbone.View.prototype.remove.call(this); }
Wydawało mi się to przesadą, ale inne podejścia do końca nie pomogły.
źródło
this.$el
zamiast$(this.el)
;)this.remove()
?Wiem, że spóźniłem się na przyjęcie, ale mam nadzieję, że przyda się to komuś innemu. Jeśli używasz wersji Backbone v0.9.9 +, możesz użyć
listenTo
istopListening
initialize: function () { this.listenTo(this.model, 'change', this.render); this.listenTo(this.model, 'destroy', this.remove); }
stopListening
jest wywoływana automatycznie przezremove
. Możesz przeczytać więcej tutaj i tutajźródło
To jest to, czego używałem. Nie widziałem żadnych problemów.
destroy: function(){ this.remove(); this.unbind(); }
źródło
Zgodnie z aktualną dokumentacją Backbone ....
view.remove ()
Usuwa widok i jego el z DOM i wywołuje stopListening, aby usunąć wszelkie powiązane zdarzenia, które widok ma ListenTo'd.
źródło
Myślę, że to powinno działać
destroyView : function () { this.$el.remove(); }
źródło
this.stopListening()
a potemreturn this
na dokładkęMożesz użyć sposobu, aby rozwiązać problem!
initialize:function(){ this.trigger('remove-compnents-cart'); var _this = this; Backbone.View.prototype.on('remove-compnents-cart',function(){ //Backbone.View.prototype.remove; Backbone.View.prototype.off(); _this.undelegateEvents(); }) }
Inny sposób : Utwórz zmienną globalną, taką jak ta:
_global.routerList
initialize:function(){ this.routerName = 'home'; _global.routerList.push(this); } /*remove it in memory*/ for (var i=0;i<_global.routerList.length;i++){ Backbone.View.prototype.remove.call(_global.routerList[i]); }
źródło