Використання $ window або $ location для перенаправлення в AngularJS


90

Додаток, над яким я працюю, містить різні стани (за допомогою ui-маршрутизатора), де деякі штати вимагають входу в систему, інші є загальнодоступними.

Я створив метод, який достовірно перевіряє, чи зареєстрований користувач, і те, з чим я зараз маю проблеми, насправді перенаправляє на нашу сторінку входу, коли це необхідно. Слід зазначити, що наразі сторінка входу не розміщується в програмі 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");

Для змінної landingUrl було встановлено значення '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 Kappel Hansen

Правильно, це не означало бути буквальним. Я не знаю, що ви визначили як маршрут для вашого перегляду входу. Введіть будь-який маршрут, який міг би бути, в аргументі методу $ location.url (). Я відредагував відповідь для ясності.
m.casey

Ах правильно. Проблема в тому, що $ location.url все ще переспрямовує на підпуть до програми. Тож використання $ location.url ('/ login') переспрямовує на www.domain.com/app/login, а не на www.domain.com/login
Торбьєрн Каппель Хансен

1
Ну, як зазначено у питанні, наразі сторінка входу знаходиться за межами програми AngularJS. Звідси необхідність перенаправлення на www.domain.com/login, а не на шлях у програмі.
Thorbjørn Kappel Hansen

5
Також варто згадати, що ви, мабуть, повинні використовувати $windowзамість цього window(джерело: stackoverflow.com/questions/28906180/… )
Калеб Фарукі,

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контролер, а також не потрібно отримувати поточну адресу хосту.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.