在 Angular 中,如何使用 $location.path 作为 $http.post 成功回调进行重定向

Posted

技术标签:

【中文标题】在 Angular 中,如何使用 $location.path 作为 $http.post 成功回调进行重定向【英文标题】:In Angular, how to redirect with $location.path as $http.post success callback 【发布时间】:2012-12-27 09:56:20 【问题描述】:

我正在尝试通过将 Post 发送到 php 文件来创建一个简单的身份验证服务,我需要它在成功时加载我的 ng-view 上的部分主页。

这是我尝试过的:

function loginCtrl($scope, $http, $location)
    $http.post(url,data).success(function(data)
        $location.path('/home');
    );

导致我的网址发生变化,但 ng-view 未更新。当我手动刷新页面时它会更新。

(路由已在$routeProvider 正确配置,我已经测试了使用独立函数重定向它而不是作为回调并且它有效)

我也尝试将$location.path('/home') 定义为一个函数,然后在回调中调用它仍然不起作用。

我做了一些研究,发现一些文章指出使用另一个第三方插件时会发生这种情况,我只加载 angular.js

对某些学习材料的任何见解或指示都会很棒

【问题讨论】:

ng-view 是什么意思?另外,$location.path() 是否在内部调用 window.location = ...? 我忘了提到这是在使用 angularjs 框架的上下文中。 - 编辑以上内容 有趣!你用萤火虫之类的吗?当路由更改时,您的应用是否会请求部分请求? 尝试在 $location.path('/home') 之后调用 $rootScope.$apply()。 @GeorgeAnandaEman,顺便说一句,你看到这个帖子了吗:***.com/questions/11784656/…?我打赌“是”,但以防万一。 【参考方案1】:

这是本文http://www.yearofmoo.com/2012/10/more-angularjs-magic-to-supercharge-your-webapp.html#apply-digest-and-phase中的changeLocation示例

//be sure to inject $scope and $location
var changeLocation = function(url, forceReload) 
  $scope = $scope || angular.element(document).scope();
  if(forceReload || $scope.$$phase) 
    window.location = url;
  
  else 
    //only use this if you want to replace the history stack
    //$location.path(url).replace();

    //this this if you want to change the URL and add it to the history stack
    $location.path(url);
    $scope.$apply();
  
;

【讨论】:

您可能应该使用 $window 服务而不是直接使用 window 对象以避免测试时出现问题。 code.angularjs.org/1.1.5/docs/api/ng.$window 一个功能外的答案:使用 $window.location = url; 我还写了一个单独的回溯历史堆栈 app.directive("backButton", function ($window) return restrict: "A", link: function (scope, elem, attrs) elem.bind("click", function () $window.history.back(); ); ; );【参考方案2】:

官方指南中有简单的答案:

它没有做什么?

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

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

【讨论】:

【参考方案3】:

我正在执行以下页面重定向(从登录到主页)。我还必须将用户对象传递给主页。所以,我正在使用 Windows 本地存储。

    $http(
        url:'/login/user',
        method : 'POST',
        headers: 
            'Content-Type': 'application/json'
          ,
        data: userData
    ).success(function(loginDetails)
        $scope.updLoginDetails = loginDetails;
        if($scope.updLoginDetails.successful == true)
            
                loginDetails.custId = $scope.updLoginDetails.customerDetails.cust_ID;
                loginDetails.userName = $scope.updLoginDetails.customerDetails.cust_NM;
                window.localStorage.setItem("loginDetails", JSON.stringify(loginDetails));
                $window.location='/login/homepage';
            
        else
        alert('No access available.');

    ).error(function(err,status)
        alert('No access available.');      
    );

它对我有用。

【讨论】:

【参考方案4】:

我没有使用success,而是将其更改为then,它可以工作。

代码如下:

lgrg.controller('login', function($scope, $window, $http) 
    $scope.loginUser = ;

    $scope.submitForm = function() 
        $scope.errorInfo = null

        $http(
            method  : 'POST',
            url     : '/login',
            headers : 'Content-Type': 'application/json'
            data: $scope.loginUser
        ).then(function(data) 
            if (!data.status) 
                $scope.errorInfo = data.info
             else 
                //page jump
                $window.location.href = '/admin';
            
        );
    ;
);

【讨论】:

【参考方案5】:

使用:$window.location.href = '/Home.html';

【讨论】:

【参考方案6】:

代码很简单..但很难罚款..

detailsApp.controller("SchoolCtrl", function ($scope, $location)  
      $scope.addSchool = function () 

        location.href='/ManageSchool/TeacherProfile?ID=' + $scope.TeacherID;
      
);

【讨论】:

以上是关于在 Angular 中,如何使用 $location.path 作为 $http.post 成功回调进行重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 @angular/upgrade 在 Angular 1 应用程序中使用 Angular 2 组件

如何在 Angular 6 中使用 angular-timelinejs3?

iOS 后台定位审核被拒How to clarify the purpose of its use in the locatio

如何在angular2中使用添加类属性

powershell 来自https://stackoverflow.com/questions/5466329/whats-the-best-way-to-determine-the-locatio

如何在 Angular 2 中使用 DataTable