在 AngularJS 中使用 $window 或 $location 重定向

IT技术 javascript angularjs redirect angular-ui-router
2021-02-04 08:56:11

我正在开发的应用程序包含各种状态(使用 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");

变量landingUrl 设置为'domain.com/login',这不适用于$window.location.href(这是我尝试过的方法之一)。但是在将代码更改为

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

它现在可以工作了。

5个回答

我相信这样做的方法是 $location.url('/RouteTo/Login');

编辑清晰

假设我的登录视图路线是/Login,我会说$location.url('/Login')导航到该路线。

对于 Angular 应用程序之外的位置(即没有定义路由),普通的旧 JavaScript 将提供:

window.location = "http://www.my-domain.com/login"
还值得一提的是,您可能应该使用$window而不是window(来源:stackoverflow.com/questions/28906180/...
2021-03-21 08:56:11
啊对。这里的问题是 $location.url 仍然重定向到应用程序的子路径。所以使用 $location.url('/login') 重定向到 www.domain.com/app/login 而不是 www.domain.com/login
2021-03-27 08:56:11
好吧,正如问题中所述,目前登录页面位于 AngularJS 应用程序之外。因此需要重定向到 www.domain.com/login 而不是应用程序内的路径。
2021-03-28 08:56:11
刚试过。不幸的是,这重定向到 www.domain.com/app/RouteTo/login 而不是 www.domain.com/login
2021-04-01 08:56:11
是的,这并不是字面上的意思。我不知道您定义的登录视图路由是什么。将该路由可能位于 $location.url() 方法的参数中。为了清楚起见,我已经编辑了答案。
2021-04-01 08:56:11

似乎整页重新加载$window.location.href是首选方式。

当浏览器 URL 更改时,它不会导致整个页面重新加载。要在更改 URL 后重新加载页面,请使用较低级别的 API,$window.location.href。

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

或许能帮到你!演示

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>

不确定是哪个版本,但我使用 1.3.14,您可以使用:

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

无需注入$location$window在控制器中,无需获取当前主机地址。

你必须把:

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

这样角度函数就可以访问“window”对象

不要害怕!
2021-03-18 08:56:11