Шаблон для управления представлениями в магистрали - PullRequest
20 голосов
/ 02 декабря 2011

Исходя из GWT, Backbone, похоже, упускает встроенное решение о том, как обрабатывать жизненный цикл представления.В GWT каждое действие, которое более или менее эквивалентно представлению в Backbone, управляется ActivityManager, который вызывает onStart / onStop для действия, передавая eventBus и элемент, в котором можно отобразить действие. На остановке,ActivityManager отменяет привязку всех событий, привязанных действием к шине событий, и удаляет представление из DOM.

В Backbone легко связать события с моделью и коллекцией, но вы должны удалить их вручную, и естьнет распространенного метода API, где вы будете делать это.

Итак, я ищу образец наилучшей практики для управления представлениями, чтобы убедиться, что ни убитые, ни отключенные представления не прослушивают ненужные события.

Ответы [ 4 ]

13 голосов
/ 02 декабря 2011

ты прав, пока нет решения для этого (пока).

однако, конечно, можно расширить магистраль для обеспечения этой функциональности, Дерик Бэйли недавно написал в блоге сообщение об этом

посмотрите здесь: http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

это ни в коем случае не является святым Граалем, вы можете применять его по своему усмотрению, но это очень простой подход для обработки видов зомби, теперь вам по-прежнему нужно заботиться о других существах, ползающих в вашей памяти, но это только начало с мнением!

5 голосов
/ 25 марта 2012

Я использую пользовательский 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's default remove method to
        // remove the view from the DOM
        Backbone.View.prototype.remove.call(this);
    }
}

Есть еще одна загвоздка: модели и коллекции нужно удалять вручную, потому что вы не знаете, используется ли ондругими взглядами тоже.

3 голосов
/ 07 июля 2012

Кажется Марионетка наконец-то имеет функциональность Я ищу.

2 голосов
/ 26 апреля 2012

Я публикую свое решение для управления представлением на 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, если представления динамические и часто меняются

...