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


72

我正在尝试通过将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 = ...?
Verdagon

1
我忘了提到这是在使用angularjs框架的上下文中。-编辑如上
George Ananda Eman

有趣!您使用萤火虫还是类似的东西?更改路线后,您的应用是否会发出部分请求?
theotheo

尝试在$ location.path('/ home')之后调用$ rootScope。$ apply()。
matys84pl 2013年

1
@GeorgeAnandaEman,顺便说一句,您是否看到此线程:stackoverflow.com/questions/11784656/…?我打赌“是”,但以防万一。
theotheo

Answers:


83

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

27
您可能应该使用$ window服务,而不是直接使用window对象,以避免测试时出现问题。code.angularjs.org/1.1.5/docs/api/ng.$window
贾斯汀

1
一个功能失常的答案:使用$ window.location = url;
Joao Polo

我还写了一个单独的后历史堆栈
Siddharth,2016年

app.directive(“ backButton”,函数($ window){返回{限制:“ A”,链接:函数(scope,elem,attrs){elem.bind(“ click”,function(){$ window.history。背部(); }); } }; });
Siddharth


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

它为我工作。


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

1

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


0

这是非常容易的代码..但是很难被罚款..

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

        location.href='/ManageSchool/TeacherProfile?ID=' + $scope.TeacherID;
      }
});
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.