Как очистить представления и модели в Backbonejs

    movieDb.Router  = Backbone.Router.extend({
        routes:{
            '':         'landPage',
            'home':     'landPage',
            'login':    'login',
            'signup':   'signup'
        },

        landPage: function(p){
            $('div#homepage').empty();
        },

        login:  function(p){
            new loginViews(); // Calls its own model                
        },

        signup: function(p){
            new signupViews(); // Calls its own model
        }
    });

Проблема заключается в том, что при входе из регистрации и вызове входа в систему он также вызывает запросы предыдущей модели (регистрация), что приводит к одновременному запросу на вход и регистрацию (мои модели - это запросы ajax), как я могу удалить ранее вызванные модели каждый раз, когда я создаю новый запрос в моих взглядах.

Спасибо.


person Barry    schedule 11.07.2012    source источник


Ответы (2)


Самый простой способ, который я нашел, — использовать Backbone.Marionette https://github.com/derickbailey/backbone.marionette, которая позволяет использовать отдельные регионы для отдельных функций.
Если вы не хотите иметь другую зависимость, вы можете сделать это вручную: http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

но если вы видите, что выборка одной модели вызывает выборку другой, то, вероятно, у вас есть либо конфликт имен, либо какая-то цепочка событий, которая вызывает вторую выборку.

person MarkKGreenway    schedule 11.07.2012
comment
но в этом случае я не могу вызвать модель без вызова конкретных представлений (loginViews, signupViews), поэтому удаление/очистка представления фактически предотвратит вызовы этой модели представлений, я уже проверил последнюю ссылку, которую вы мне дали, и я нашел ее немного сложно для новичка вроде меня. - person Barry; 11.07.2012
comment
почему бы не зарегистрироваться: function(p){ window.signupModel = new SignupModel(); новый signupViews ({модель: window.signupModel}); } - person MarkKGreenway; 11.07.2012
comment
это не отличается от моей реализации, только то, что я вызываю модель в представлениях, а не от маршрутизатора, так что это не решает, все равно спасибо - person Barry; 11.07.2012
comment
с window.signupModel вы можете легко удалить его, когда он вам не нужен, как в маршруте входа - person MarkKGreenway; 11.07.2012

Я просто хочу поделиться тем, как я решил эту проблему (очень простой подход, не уверен, что это лучшая практика, но это сработало).

Я расширил представление с функцией закрытия

    Backbone.View.prototype.close = function () {
        this.unbind();
        this.undelegateEvents();
    };

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

    showView: function (view) {
        //destroy current view
        if(this.currentView !== undefined) {
            this.currentView.close();
        }

        //create new view
        this.currentView = view;
        this.currentView.delegateEvents();

        return this.currentView;
     }

Затем вызовите эту функцию showView в моем представлении

     addMovie:   function(p){
        this.showView(this.movieForm('add'));               
    }
person Barry    schedule 19.07.2012