2014-01-14 40 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

此示例阻止匿名用戶訪問的路由。我問的問題是如何允許匿名用戶轉移到路由,如果他們決定登錄,他們可以在登錄後返回到該路由。這與指南中的內容不完全相同。 –