使用$ 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");

变量LandingUrl设置为'domain.com/login',它与$ window.location.href一起不起作用(这是我尝试过的事情之一)。但是将代码更改为

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

现在可以使用了。


可能还应该补充一点,即数据上也有服务器端身份验证,因此以上并不是唯一的身份验证,重定向到登录页面,而不是显示一个大部分为空的页面,更是一个方便的问题。
托尔比约恩卡普尔汉森

1
您需要location使用$window.location=...
以下

相反,您可以考虑使所有这一切都成为包括您的身份验证的AngularJS -请参阅此帖子frederiknakstad.com/2013/01/21/…–
Soren

该计划最终将在AngularJS应用程序中包含所有内容(包括登录名),但是由于我们当前正在过渡到AngularJS,因此在此阶段注册/登录屏幕似乎不是最重要的。
托尔比约恩卡普尔汉森

Answers:


81

我相信这样做的方法是 $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ørnKappel Hansen

是的,这并不是字面上的意思。我不知道您为登录视图定义的路线是什么。将任何路由放置在$ location.url()方法的参数中。为了清楚起见,我已经编辑了答案。
m.casey 2014年

对啊 这里的问题是$ location.url仍重定向到应用程序的子路径。因此,使用$ location.url('/ login')重定向到www.domain.com/app/login而不是www.domain.com/login
–ThorbjørnKappel Hansen

1
好吧,正如问题中所述,当前登录页面位于AngularJS应用之外。因此,需要重定向到www.domain.com/login而不是应用程序中的路径。
托尔比约恩卡普尔汉森

5
还值得一提的是,您可能应该使用$window而不是window(source:stackoverflow.com/questions/28906180/…
Caleb Faruki 2016年


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插入控制器,也无需获取当前主机地址。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.