Ответ 1
Кажется, Marionette наконец имеет функциональность я Я ищу.
Из GWT, Backbone, кажется, пропустил встроенное решение о том, как обрабатывать жизненный цикл представления. В GWT каждое действие, которое в большей или меньшей степени эквивалентно представлению в магистрали, управляется ActivityManager, который вызывает onStart/onStop в действии, передает EventBus и элемент, в котором может быть реализована операция. ActivityManager отменит все события, которые активность привязана к eventbus, и удалит представление из DOM.
В Backbone легко привязать события к модели и коллекции, но вы должны удалить их вручную, и нет общего метода api, где вы это сделаете.
Итак, я ищу образец лучшей практики, как управлять представлениями, чтобы не убивать или отключать просмотры, которые не нужны событиям.
Кажется, Marionette наконец имеет функциональность я Я ищу.
вы правы, в этом нет возможности построить решение (пока).
однако, конечно, возможно расширить магистраль, чтобы обеспечить эту функциональность, Derick Bailey написал сообщение в блоге об этом недавно,
смотрите здесь: http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/
это ни в коем случае не святой Грааль, вы свободны реализовать по своему усмотрению, но это очень прямой подход, для обработки представлений зомби, теперь вам все равно нужно позаботиться о других существах, сканирующих в вашей памяти, но это начинается с просмотров по крайней мере!
Я использую настраиваемый BaseView, который расширяет метод удаления Backbone:
app.BaseView = Backbone.View.extend({
views: [], // array to keep a ref of child-views for proper disposal later on
remove: function() {
// dispose any sub-views
_.each(this.views || [], function(view) {
view.remove();
});
// if the inheriting class defines a custom on-remove method, call it!
_.isFunction(this.onRemove) && this.onRemove();
// unbind all events from this view
this.off();
// finally, call Backbone default remove method to
// remove the view from the DOM
Backbone.View.prototype.remove.call(this);
}
}
По-прежнему существует улов: модели и коллекции должны быть удалены вручную, потому что вы не знаете, использует ли он другие представления.
Я отправляю свое решение для управления представлением https://github.com/thomasdao/Backbone-View-Manager.
Менеджер просмотров всегда будет очищать существующий вид перед созданием нового представления. Теперь я инициализирую новый вид:
newView = VM.createView("newView", function(){
return new View();
};
Если я хочу повторно использовать представление вместо создания нового, я могу использовать
newView = VM.reuseView("newView", function() {
return new View();
}
Различие между VM.reuseView и VM.createView заключается в том, что reuseView будет искать существующее представление с именем "newView", если оно вернется к вам. В остальном он выполнит функцию обратного вызова и результат кэширования. VM.createView всегда выполняет функцию обратного вызова и очищает существующее представление для вас. Следовательно, вы можете использовать VM.createView, если представления динамичны и часто меняются