AngularJS$位置未更改路径

AngularJS$位置未更改路径,angularjs,Angularjs,我在提交表单后更改页面URL时遇到问题 以下是我的应用程序流程: 路由被设置,URL被识别到某个表单页面 页面加载、控制器设置变量、指令被激发 触发一个特殊表单指令,该指令使用AJAX执行特殊表单提交 在执行AJAX之后(Angular不负责AJAX),将触发回调,指令将调用设置位置的$scope.onAfterSubmit函数 问题是,在设置了位置之后,什么也没有发生。我也尝试过将location参数设置为/。。。不。我也试着不提交表格。什么都不管用 我已经测试过代码是否在提交后到达onAft

我在提交表单后更改页面URL时遇到问题

以下是我的应用程序流程:

  • 路由被设置,URL被识别到某个表单页面
  • 页面加载、控制器设置变量、指令被激发
  • 触发一个特殊表单指令,该指令使用AJAX执行特殊表单提交
  • 在执行AJAX之后(Angular不负责AJAX),将触发回调,指令将调用设置位置的
    $scope.onAfterSubmit
    函数
  • 问题是,在设置了位置之后,什么也没有发生。我也尝试过将location参数设置为
    /
    。。。不。我也试着不提交表格。什么都不管用

    我已经测试过代码是否在提交后到达
    onAfterSubmit
    函数(它确实到达)

    我唯一的想法是函数的作用域在某种程度上发生了变化(因为它是从指令调用的),但是如果作用域发生了变化,它又如何在提交后调用
    onAfterSubmit

    这是我的密码

    var Ctrl = function($scope, $location, $http) {
      $http.get('/resources/' + $params.id + '/edit.json').success(function(data) {
        $scope.resource = data;
      });
    
      $scope.onAfterSubmit = function() {
        $location.path('/').replace();
      };
    }
    Ctrl.$inject = ['$scope','$location','$http'];
    

    有人能帮我吗?

    几天前我也遇到过类似的问题。在我的例子中,问题是我用第三方库(确切地说是jQuery)改变了一些事情,在这种情况下,即使调用函数和设置变量,Angular并不总是意识到有变化,因此它永远不会消化

    $apply()用于从angular框架外部执行angular中的表达式。(例如,来自浏览器DOM事件、setTimeout、XHR或第三方库)


    在您更改位置并调用
    replace()
    后,尝试立即使用
    $scope.$apply()
    ,让Angular知道情况发生了变化。

    我也遇到了同样的问题,但对$location的调用已经在摘要中。调用$apply()只会导致$digest已在进程中出错

    这个技巧奏效了(请确保将
    $location
    注入控制器):

    虽然不知道为什么这是必要的

    setTimeout(function() { $location.path("/abc"); },0);
    

    它应该可以解决您的问题。

    我使用了该服务,而不是
    $location.path(…)
    来更改或刷新页面。在Angular中,此服务用作
    窗口
    对象的接口,
    窗口
    对象包含一个属性,可用于处理与位置或URL内容相关的操作

    例如,使用
    window.location
    可以指定一个新页面,如下所示:

    $window.location.assign('/');
    
    或者刷新它,如下所示:

    $window.location.reload();
    

    这对我有用。这与你期望的有点不同,但对给定的目标有效

    我必须像这样嵌入我的
    $location.path()
    语句,因为我的摘要仍在运行:

           function routeMe(data) {                
                var waitForRender = function () {
                    if ($http.pendingRequests.length > 0) {
                        $timeout(waitForRender);
                    } else {
                        $location.path(data);
                    }
                };
                $timeout(waitForRender);
            }
    

    在我的例子中,问题是模板配置中缺少可选参数指示符(“?”)

    例如:

    .when('/abc/:id?', {
        templateUrl: 'views/abc.html',
        controller: 'abcControl'
    })
    
    
    $location.path('/abc');
    

    如果没有询问字符,路由显然不会改变,因为会抑制路由参数。

    如果您中的任何人正在使用Angular ui/ui路由器,请使用:
    $state.go('yourstate')
    而不是
    $location
    。它帮了我的忙。

    这对我来说很好(用咖啡脚本)


    在我看来,这里的许多答案似乎有点粗糙(例如$apply()或$timeout),因为乱用$apply()可能会导致不必要的错误

    通常,当$location不起作用时,意味着某些东西没有以角度方式实现

    在这个特定的问题中,问题似乎出现在非角度AJAX部分。我有一个类似的问题,使用$location的重定向应该在承诺解决后进行。我想用这个例子来说明这个问题

    旧代码:

    taskService.createTask(data).then(function(code){
                $location.path("task/" + code);
            }, function(error){});
    
    注意:taskService.createTask返回一个承诺

    $q-使用承诺的角度:

    let dataPromises = [taskService.createTask(data)];
            $q.all(dataPromises).then(function(response) {
                    let code = response[0];
                    $location.path("task/" + code);
                }, 
                function(error){});
    
    使用$q来解决promise解决了重定向问题



    更多关于$q服务的信息:$q

    非常有魅力。我已经将我使用的代码添加到您的帖子中,以使其正常工作:)非常感谢!!!为了更好地了解$apply如何使用angular以及如何解决它的问题,这里有一个@Skeater的链接,您可以简单地插入根作用域并对其进行操作,就像这样:factory('xyz',['$rootScope',function($rootScope){…}])可以用$timeout包装您的回调,并且该作用域将被正确应用,就像JasonS说的,使用$timeout(function(){//apply changes here});这有两个优点:1)您不需要访问$scope。2) 你不必担心$apply alredy的运行。出于第二个原因,使用$timeout通常是首选方法。只需检查阶段,以防它在摘要中,然后您可以跳过申请。Angular将赶上它并自行更改URL:超时对我来说似乎是一个肮脏的黑客行为。如果您的href包含“#”,则$location.path()无法按预期工作。只需完全删除a标记上的href=“#”或设置为href=“”,您就不需要使用$timeout$$phase是一个私有变量,您不应该尝试访问它,因为它在新的angularjs版本中可能会更改。使用$timeout可能是一种攻击,但使用$$phase则是一种更大的攻击。一般来说,不要查看或触摸以$$为前缀的任何东西。在大约10个小时的随机事件破坏后。。。这个解决方案对我有效!运行非设置超时是一个非常糟糕的主意。而且,正如@matsko上面所说,$timeout并不是最好的主意。请记住,它可能是在那一年之前创建的。是的,再加上一年的好处,另一个有一个更准确的公认答案。@JimG。这不是重复的问题,这个问题是4年前的问题,你链接的问题是2年前的问题。我也是,$location.path()在url有参数时不会重定向。这是正确答案。谢谢你的功能,非常有用!对我来说,问题是我们使用的是角块用户界面,它阻止了地址栏位置的更新。我们
    taskService.createTask(data).then(function(code){
                $location.path("task/" + code);
            }, function(error){});
    
    let dataPromises = [taskService.createTask(data)];
            $q.all(dataPromises).then(function(response) {
                    let code = response[0];
                    $location.path("task/" + code);
                }, 
                function(error){});