2014-01-08 65 views
3

我現在有兩個視圖。

  • 登錄
  • 主要

現在我登錄並更改爲/main的正常工作我的道路。當我沒有登錄,並嘗試訪問/main我的網絡服務返回"Access denied for user anonymous"然後我將它們轉發到/這是我的登錄視圖。我怎麼能通過一些東西,所以我的LoginController知道他們從/main轉發,以提醒他們先登錄?

LoginController.js

VforumJS.controller('LoginController', function($scope, $location, $routeParams, LoginModel) 
{ 
    $scope.email  = ""; 
    $scope.password  = ""; 
    $scope.fetching  = false; 
    $scope.error  = null; 

    $scope.login = function() 
    { 
     $scope.error = null; 
     $scope.fetching = true; 
     LoginModel.login($scope.email, $scope.password); 
    } 

    $scope.$on('LoginComplete', function(event, args) 
    { 
     log('login complete: ' + args.result); 
     $scope.fetching = false; 
     if (args.result == "success") 
     { 
      $location.path('/main'); 
     } 
     else 
     { 
      $scope.error = args.result; 
     } 
    }); 
}); 

MainController.js

VforumJS.controller('MainController', function($scope, $location, $routeParams, MainModel) 
{ 
    $scope.currentTitle  = '-1'; 
    $scope.presentationData = MainModel.getPresentations(); 

    $scope.$on('PresentationsLoaded', function(event, args) 
    { 
     log(args.result); 
     if (args.result != "Access denied for user anonymous") 
     { 
      //-- Parse preso data 
      $scope.presentationData = args.result; 
     } 
     else 
     { 
      //-- Need to login first, route them back to login screen 
      $location.path("/"); 
     } 
    }); 
}); 

回答

3

您可以使用$location.search()MainController傳遞查詢字符串到LoginController

裏面你MainController

if (args.result != "Access denied for user anonymous") 
    { 
     //-- Parse preso data 
     $scope.presentationData = args.result; 
    } 
    else 
    { 
     //-- Need to login first, route them back to login screen 
     $location.search({ redirectFrom: $location.path() }); 
     $location.path("/"); 
    } 

,然後在LoginController,縮短爲簡潔:

VforumJS.controller('LoginController', function($scope, $location, $routeParams, LoginModel) 
{ 
    var queryString = $location.search(); 

    $scope.$on('LoginComplete', function(event, args) 
    { 
     log('login complete: ' + args.result); 
     $scope.fetching = false; 
     if (args.result == "success") 
     { 
      if (queryString && queryString.redirectFrom) { 
       $location.path(queryString.redirectFrom); 
      } else { 
       $location.path('/somedefaultlocation'); 
      } 
     } 
     else 
     { 
      $scope.error = args.result; 
     } 
    }); 
}); 

或者您可以使用一個共享的服務,甚至你的LoginModel設置從MainController參數以表明重定向來自它。

更新 甚至更​​好,使用$httpProvider.interceptors註冊一個響應攔截器,然後使用與上述相同的技術$location.search()重定向到上認證失敗的登錄屏幕。這種方法非常理想,因爲您的控制器會清除認證邏輯。

+0

非常好,使用$ location.search()爲我工作,謝謝。 – Ronnie

0

$location廣播$locationChangeStart$locationChangeSuccess事件,每個的第三個參數是oldUrl

一個解決方案是訂購$locationChangeStart的服務,以保存當前和舊的網址。

當您點擊/時,您的LoginController可以檢查您的服務,看看oldUrl是否爲/main,然後採取相應措施。