Как переключать представления с помощью роутера backbone.js?

Это скорее концептуальный вопрос с точки зрения использования магистрального маршрутизатора и рендеринга представлений в магистрали.

В качестве примера (с чем я собираюсь это научиться) у меня есть базовое приложение CRUD для контактов, с формой создания, списком всех контактов, единым представлением контактов и формой редактирования.

для простоты я скажу, что я хотел бы видеть только одну из этих вещей одновременно. Очевидно, что показывать и скрывать их с помощью jQuery было бы тривиально, но это не то, что мне нужно.

У меня есть две идеи,

1) запускать пользовательские события из моего маршрутизатора, который удаляет все представления и отправляет события, которые можно прослушивать во всех представлениях (вызывая метод close), и основное представление приложения, которое затем создает конкретное представление, т.е.

App.Router = Backbone.Router.extend({
    routes: {
        '' : 'index',
        'addnew' : 'addNew',
        'contacts/:id' : 'singleContact',
        'contacts/:id/edit' : 'editContact'
    },

    index: function(){

        vent.trigger('contactR:closeAll');
        vent.trigger('contactR:index');
    },

    addNew: function() {

        vent.trigger('contactR:closeAll');
        vent.trigger('contactR:addNew');
    },

    singleContact: function(id) {

        vent.trigger('contactR:closeAll');
        vent.trigger('contactR:singleContact', id);
    },

    editContact: function(id) {

        vent.trigger('contactR:closeAll');
        vent.trigger('contactR:editContact', id);
    },

});

(nb: vent расширяет магистральные события obj, так что я могу паб / саб)

2) или можно / можно / нужно отправить событие close all и создать экземпляр представления в маршрутизаторе?

Обратите внимание, что я хочу достичь этого, не углубляясь в дополнительные библиотеки или фреймворки, такие как марионетка и т. Д.

1 ответ

Решение

Вы можете использовать служебный объект, как это:

var ViewManager = {
    currentView : null,
    showView : function(view) {
        if (this.currentView !== null && this.currentView.cid != view.cid) {
            this.currentView.remove();
        }
        this.currentView = view;
        return view.render();
    }
}

и всякий раз, когда вы хотите показать использование вида ViewManager.showView(yourView)

App.Router = Backbone.Router.extend({
    routes: {
        '' : 'index',
        'addnew' : 'addNew',
        'contacts/:id' : 'singleContact',
        'contacts/:id/edit' : 'editContact'
    },

    index: function(){
        var indexView ...
        ViewManager.showView(indexView);
    },

    addNew: function() {
        var addNewView ...
        ViewManager.showView(addNewView);
    },

    singleContact: function(id) {
        var singleContactView ...
        ViewManager.showView(singleContactView);
    },

    editContact: function(id) {
        var editContactView ...
        ViewManager.showView(editContactView);
    },

});

Так что именно ViewManager отвечает за отображение ваших представлений

Другие вопросы по тегам