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

时间:2013-01-13 07:26:57

标签: javascript model-view-controller angularjs

我试图通过发送一个帖子到一个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

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

6 个答案:

答案 0 :(得分:82)

以下是本文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();
  }
};

答案 1 :(得分:14)

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

  

它不做什么?

     

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

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

答案 2 :(得分:3)

我正在进行以下页面重定向(从登录到主页)。我必须将用户对象也传递给主页。所以,我正在使用windows localstorage。

    $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.');      
    });

它对我有用。

答案 3 :(得分:2)

我没有使用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';
            }
        });
    };
});

答案 4 :(得分:1)

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

答案 5 :(得分:0)

这是非常简单的代码..但很难被罚款..

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

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