$ window 또는 $ location을 사용하여 AngularJS에서 리디렉션


90

내가 작업중인 앱에는 여러 상태 (ui-router 사용)가 포함되어 있습니다. 일부 상태에서는 로그인이 필요하고 다른 상태는 공개적으로 사용 가능합니다.

사용자가 로그인했는지 여부를 유효하게 확인하는 방법을 만들었습니다. 현재 문제가있는 것은 실제로 필요할 때 로그인 페이지로 리디렉션하는 것입니다. 로그인 페이지는 현재 AngularJS 앱 내에 있지 않습니다.

app.run(function ($rootScope, $location, $window) {


    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {

        if (toState.data.loginReq && !$rootScope.me.loggedIn) {
            var landingUrl = $window.location.host + "/login";
            console.log(landingUrl);
            $window.open(landingUrl, "_self");
        }
    });
});

console.log는 의도 한 URL을 올바르게 표시합니다. 그 이후의 줄은 $ window.open에서 window.location.href까지 거의 모든 것을 시도했으며 어떤 시도를하더라도 리디렉션이 발생하지 않습니다.

수정 (해결됨) :

문제를 찾았습니다.

var landingUrl = $window.location.host + "/login";
$window.open(landingUrl, "_self");

landUrl 변수는 'domain.com/login'으로 설정되어 $ window.location.href (내가 시도한 것 중 하나임)에서 작동하지 않습니다. 그러나 코드를 다음으로 변경 한 후

var landingUrl = "http://" + $window.location.host + "/login";
$window.location.href = landingUrl;

이제 작동합니다.


데이터에 대한 서버 측 인증도 있다고 추가해야하므로 위의 인증이 유일한 인증이 아니므로 대부분 빈 페이지를 표시하는 대신 로그인 페이지로 리디렉션하는 것이 더 편리합니다.
Thorbjørn Kappel Hansen

1
당신은 네이티브 필요 location사용 목적$window.location=...
charlietfl

대신 인증을 포함하여 모든 AngularJS로 만드는 것을 고려할 수 있습니다.-이 게시물 frederiknakstad.com/2013/01/21/…
Soren

계획은 결국 AngularJS 앱 내부에 모든 것 (로그인 포함)을 포함하는 것이지만, 현재 AngularJS로 전환하고 있으므로이 단계에서는 등록 / 로그인 화면이 가장 중요하지 않은 것 같습니다.
Thorbjørn Kappel Hansen

답변:


82

이 작업을 수행하는 방법은 $location.url('/RouteTo/Login');

명확성을 위해 편집

내 로그인보기의 경로가라고 말하면 해당 경로로 이동 /Login한다고 말할 $location.url('/Login')수 있습니다.

Angular 앱 외부 위치 (즉, 경로가 정의되지 않음)의 경우 일반 오래된 JavaScript가 다음과 같이 제공됩니다.

window.location = "http://www.my-domain.com/login"

그냥 해봤어요. 불행하게도, 그 www.domain.com/app/RouteTo/login로 리디렉션 오히려 www.domain.com/login 이상
Thorbjørn 카펠 한센

맞다, 그것은 문자 그대로라는 의미가 아니었다. 로그인보기의 경로로 정의한 내용을 모르겠습니다. $ location.url () 메서드에 대한 인수에 해당 경로가 무엇이든 배치하십시오. 명확성을 위해 답변을 편집했습니다.
m.casey

아 맞다. 여기서 문제는 $ location.url이 여전히 앱의 하위 경로로 리디렉션된다는 것입니다. 그래서 $ location.url를 ( '/ 로그인')를 사용하는 것은 www.domain.com/login보다는 www.domain.com/app/login 리디렉션
Thorbjørn 카펠 한센

1
글쎄, 질문에서 언급했듯이 현재 로그인 페이지는 AngularJS 앱 외부에 있습니다. 따라서 앱 내의 경로가 아닌 www.domain.com/login으로 리디렉션해야합니다.
Thorbjørn Kappel Hansen

5
그것은 당신이 아마 사용해야 언급도 가치가 $window대신 window: (소스 stackoverflow.com/questions/28906180/... )
갈렙 Faruki

39

전체 페이지를 다시로드 $window.location.href하는 것이 선호되는 방법 인 것 같습니다 .

브라우저 URL이 변경 될 때 전체 페이지를 다시로드하지 않습니다. URL을 변경 한 후 페이지를 다시로드하려면 하위 수준 API 인 $ window.location.href를 사용하세요.

https://docs.angularjs.org/guide/$location


19

도움이 될 것입니다! 데모

AngularJs 코드 샘플

var app = angular.module('urlApp', []);
app.controller('urlCtrl', function ($scope, $log, $window) {
    $scope.ClickMeToRedirect = function () {
        var url = "http://" + $window.location.host + "/Account/Login";
        $log.log(url);
        $window.location.href = url;
    };
});

HTML 코드 샘플

<div ng-app="urlApp">
    <div ng-controller="urlCtrl">
        Redirect to <a href="#" ng-click="ClickMeToRedirect()">Click Me!</a>
    </div>
</div>

3

어떤 버전인지 확실하지 않지만 1.3.14를 사용하고 다음을 사용할 수 있습니다.

window.location.href = '/employee/1';

삽입 할 필요가 없습니다 $location또는 $window컨트롤러와 현재 호스트 주소를 얻을 필요가 없습니다이다.


-11

당신은 넣어야합니다 :

< html ng-app = "urlApp"ng-controller = "urlCtrl">

이렇게하면 각도 함수가 "창"객체에 액세스 할 수 있습니다.


두려워하지 마세요!
Mika
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.