2014-01-14 3 views
8

У меня есть приложение, в котором анонимные пользователи могут видеть только просмотр. Когда пользователь нажимает на ссылку для входа в систему, я хочу сохранить текущий маршрут и модель и восстановить ее после успешной проверки подлинности.EmberJS: Вернуться к текущему маршруту после входа в систему

Это немного отличается от большинства примеров, перехватывать переход в beforeModel и перенаправляют войти в систему.

App.ApplicationController = Ember.Controller.extend({ 
    actions: { 
     logIn: function() { 
      this.set('previousPath', this.get('currentPath')); 
      this.transitionToRoute('login'); 
     } 
    } 
}); 

App.LoginController = Ember.Controller.extend({ 
    needs: 'application', 
    username: '', 
    password: '', 

    actions: { 
     logIn: function() { 
      var self = this; 

      App.session.logIn(this.get('username'), this.get('password')).then(
       function() { 
        var route = self.get('controllers.application.previousPath') 
        self.transitionToRoute(route); 
       }); 
     } 
    } 
}); 

Это прекрасно работает для статических маршрутов, но для динамических маршрутов образцовые и маршрутные параметры теряются.

Как взять или модель текущего контроллера или параметры маршрута, чтобы я мог их восстановить?

ответ

6

Я нашел способ сделать это, похожее на шаблон перехвата-перенаправления-повтора.

Во-первых, помните, самый последний переход в пути приложения до тех пор, как это не переход войти:

App.ApplicationRoute = Ember.Route.extend({ 
    beforeModel: function(transition) { 
     this._saveTransition(transition); 
    }, 
    actions: { 
     willTransition: function (transition) { 
      this._saveTransition(transition); 
     } 
    }, 
    _saveTransition: function (transition) { 
     if (transition.targetName !== 'login') { 
      this.controllerFor('login').set('previousTransition', transition); 
     } 
    } 
}); 

beforeModel пожары, когда приложение вводится или если страница трудно обновляется. willTransition срабатывает при каждом последующем переходе.

Затем LoginController может повторить предыдущий переход после успешной аутентификации:

App.LoginController = Ember.Controller.extend({ 
    username: '', 
    password: '', 

    actions: { 
     logIn: function() { 
      var self = this; 

      App.session.logIn(this.get('username'), this.get('password')).then(
       function() { 
        var previousTransition = self.get('previousTransition'); 

        if (previousTransition) { 
         previousTransition.retry(); 
         return; 
        } 

        self.transitionToRoute('index'); 
       }); 
     } 
    } 
}); 
1

Направляющие имеют корпус, который, кажется, именно то, что вы ищете.

App.SomeAuthenticatedRoute = Ember.Route.extend({ 
    beforeModel: function(transition) { 
    if (!this.controllerFor('auth').get('userIsLoggedIn')) { 
     var loginController = this.controllerFor('login'); 
     loginController.set('previousTransition', transition); 
     this.transitionTo('login'); 
    } 
    } 
}); 

App.LoginController = Ember.Controller.extend({ 
    actions: { 
    login: function() { 
     // Log the user in, then reattempt previous transition if it exists. 
     var previousTransition = this.get('previousTransition'); 
     if (previousTransition) { 
     this.set('previousTransition', null); 
     previousTransition.retry(); 
     } else { 
     // Default back to homepage 
     this.transitionToRoute('index'); 
     } 
    } 
    } 
}); 

для получения более подробной информации см STORING AND RETRYING A TRANSITION

+1

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

Смежные вопросы