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

Javascript 在AngularJS中使用$window或$location重定向,javascript,angularjs,redirect,angular-ui-router,Javascript,Angularjs,Redirect,Angular Ui Router,我正在使用的应用程序包含各种状态(使用ui路由器),其中一些状态要求您登录,其他状态是公开可用的 我创建了一个方法,可以有效地检查用户是否登录,我目前遇到的问题实际上是在必要时重定向到我们的登录页面。需要注意的是,登录页面当前不在AngularJS应用程序中 app.run(function ($rootScope, $location, $window) { $rootScope.$on('$stateChangeStart', function (event, toState,

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

它现在可以工作了。

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

为清晰起见进行编辑

假设我的登录视图的路径是
/login
,我会使用
$location.url('/login')
导航到该路径

对于Angular应用程序之外的位置(即未定义路线),纯旧JavaScript将提供:

window.location = "http://www.my-domain.com/login"
它可能会帮助你

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;
    };
});
<div ng-app="urlApp">
    <div ng-controller="urlCtrl">
        Redirect to <a href="#" ng-click="ClickMeToRedirect()">Click Me!</a>
    </div>
</div>
HTML代码示例

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;
    };
});
<div ng-app="urlApp">
    <div ng-controller="urlCtrl">
        Redirect to <a href="#" ng-click="ClickMeToRedirect()">Click Me!</a>
    </div>
</div>

重定向到

对于整个页面重新加载,
$window.location.href
似乎是首选方法

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

您必须:


通过这种方式,角度函数可以访问“窗口”对象

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

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

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

可能还应添加数据上的服务器端身份验证,因此上述身份验证不是唯一的身份验证,更方便的是重定向到登录页面,而不是显示一个空的页面。您需要使用<代码>位置$>代码>对象,使用<代码> $Value.List=…./Cord>,而您可以考虑将其全部包括一个包含您的身份验证的angurjs。但由于我们目前正在向AngularJS过渡,注册/登录屏幕在这一阶段似乎是最不重要的。不幸的是,这会重定向到www.domain.com/app/RouteTo/login,而不是www.domain.com/loginRight,这并不是字面意思。我不知道您为登录视图定义了什么路由。将该路由可能位于$location.url()方法的参数中。为了清楚起见,我编辑了答案。啊,对了。这里的问题是$location.url仍然重定向到应用程序的子路径。因此,使用$location.url('/login')重定向到www.domain.com/app/login而不是www.domain.com/loginWell,如问题中所述,当前登录页面位于AngularJS应用程序之外。因此需要重定向到www.domain.com/login,而不是应用程序中的路径。同样值得一提的是,您可能应该使用
$window
,而不是
window
(来源:)不要害怕!