2015-07-15 22 views
6

Làm cách nào để có thể nhận được đoạn mã băm URL từ các thông số tuyến đường trong $routeChangeStart.

$scope.$on('$routeChangeStart', function (event, next, current) { 
    // trying to get the url hash fragment from <next> param here 
    // e.g. to_url_function(next) -> '/my_path/1' 
}); 

Tiếp nhận URL hash mảnh sẽ dễ dàng sử dụng $locationChangeStart nhưng đây không phải là một lựa chọn cho tôi.

+0

việc kiểm tra này ra http://stackoverflow.com/questions/11541695/redirecting-to-a-certain-route-based-on-condition – stackg91

+1

Cảm ơn. Tôi đã nhìn thấy điều này trước đây nhưng tôi không nghĩ nó giúp ích cho vấn đề cụ thể của tôi. – dasboe

Trả lời

5

dasboe: Tôi nghĩ tôi đang trả lời câu hỏi của bạn.

Tôi có một ứng dụng có kiểm tra xác thực/ủy quyền trong trình xử lý sự kiện $ routeChangeStart. Nếu không được xác thực, tôi trình bày người dùng với trang đăng nhập phương thức. Tôi muốn đăng nhập thành công để gửi chúng đến đích ban đầu của họ (Beauty of $ routeChangeStart là nó sẽ chạy lại và kiểm tra ủy quyền sau khi đăng nhập thành công). Tôi lưu đường dẫn được xây dựng từ kế tiếp trong một dịch vụ phiên người dùng được đưa vào bộ điều khiển đăng nhập phương thức.

ở đây là xử lý sự kiện

//before each route change, check if the user is logged in 
//and authorized to move onto the next route 
$rootScope.$on('$routeChangeStart', function (event, next, prev) { 
    if (next !== undefined) { 
     if ('data' in next) { 
      if ('authorizedRoles' in next.data) { 
       var authorizedRoles = next.data.authorizedRoles; 
       if (!SessionService.isAuthorized(authorizedRoles)) { 
        event.preventDefault(); 
        SessionService.setRedirectOnLogin(BuildPathFromRoute(next)); 
        if (SessionService.isLoggedIn()) { 
         // user is not allowed 
         $rootScope.$broadcast(AUTH_EVENTS.notAuthorized); 
        } else { 
         // user is not logged in 
         $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated); 
        } 
       } 
      } 
     } 
    } 
}); 

Đây là chức năng mà xây dựng con đường từ đối tượng kế tiếp

function BuildPathFromRoute(routeObj) 
{ 
    var path = routeObj.$$route.originalPath; 
    for (var property in routeObj.pathParams) 
    { 
     if (routeObj.pathParams.hasOwnProperty(property)) 
     { 
      var regEx = new RegExp(":" + property, "gi"); 
      path = path.replace(regEx, routeObj.pathParams[property].toString()); 
     } 
    } 
    return path; 
} 

Ghi chú:

  • Tôi không quan tâm trên sự phụ thuộc vào lộ trình $$ của tôi, nhưng tôi không thể tìm ra cách nào khác để làm điều đó. Có lẽ tôi đã bỏ lỡ một cái gì đó dễ dàng hơn. Tôi có thể đang gặp rắc rối trong thời gian dài.
  • Ngăn chặnDefault() sẽ không hoạt động trên các phiên bản AngularJS trước 1.3.7 (xem event.preventDefault() not working for routeChangeStart in angularjs app).
  • Thông báo trước tiêu chuẩn: Đây là tất cả các mặt của khách hàng và chịu sự lạm dụng. Đảm bảo xác thực/ủy quyền xảy ra phía máy chủ.
  • Đối tượng Route kế tiếp (từ trình xử lý sự kiện) cũng có thuộc tính params. Tôi không chắc liệu tôi có nên quay qua các thuộc tính của nó như tôi làm với pathParams hay không.
0

Nếu bạn không muốn sử dụng hasOwnProperty, bạn có thể tận dụng lợi thế của $$route.keys để có được tên của các tên pathParams lĩnh vực:

function getPathFromRoute(routeObj) 
{ 
    var path = routeObj.$$route.originalPath; 
    var keys = routeObj.$$route.keys; 
    var value;  
    for (var i = 0; i < keys.length; i++) { 
     if(angular.isDefined(keys[i]) && angular.isDefined(keys[i].name)){ 
      value = routeObj.pathParams[keys[i].name]; 
      var regEx = new RegExp(":" + keys[i].name, "gi"); 
      path = path.replace(regEx, value.toString());    
     } 
    }  
    return path; 
}; 
0

Không sử dụng các lĩnh vực đối tượng với $$ tiền tố như trong các câu trả lời được đưa ra trước đó, bởi vì đó là tiền tố được AngularJS sử dụng cho các thuộc tính riêng tư. Sử dụng phương pháp này cho get url từ đường (không kiểm tra):

var buildPathFromRoute = function (route) { 
    // get original route path 
    var path = route.originalPath; 
    // get params keys 
    var keysLength = route.keys.length; 
    for (var i=0; i<keysLength; i+=1) { 
     var param = route.keys[i]; 

     // optional params postfix is '?' 
     var postfix = param.optional ? '\\?' : ''; 

     var replaceString = ':' + param.name + postfix; 
     var regex = new RegExp(replaceString, 'g'); 
     var paramValue = route.params[param.name].toString(); 

     // replace param with value 
     path = path.replace(regex, paramValue); 
    } 

    path = path.replace(/\:\S+?\??/g, ''); 
    return path; 
}; 
Các vấn đề liên quan