AngularJS $位置不改变路径

时间:2012-08-02 19:42:56

标签: angularjs

我在提交表单后更改页面的网址时遇到问题。

以下是我的应用流程:

  1. 设置了路由,URL被识别为某个表单页面。
  2. 页面加载,控制器设置变量,指令被触发。
  3. 触发了一个特殊的表单指令,它使用AJAX执行特殊的表单提交。
  4. 执行AJAX后(Angular不处理AJAX)然后触发回调,指令调用设置位置的$scope.onAfterSubmit函数。
  5. 问题是在设置位置后没有任何反应。我已经尝试将位置参数设置为/ ......不。我也试过不提交表格。什么都行不通。

    我已经过测试,看看代码是否达到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'];
    

    有人可以帮帮我吗?

9 个答案:

答案 0 :(得分:289)

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

  

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

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

答案 1 :(得分:52)

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

例如,使用window,您可以指定新页面,如下所示:

window.location

或刷新它,如下:

$window.location.assign('/');

它对我有用。它与您的期望略有不同,但适用于给定的目标。

答案 2 :(得分:24)

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

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

$timeout(function(){ 
   $location...
},1);

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:2)

就我而言,问题是我的模板配置中缺少可选参数指示符('?')。

例如:

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


$location.path('/abc');

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

答案 5 :(得分:1)

如果您有任何人使用Angular-ui / ui-router,请使用:$state.go('yourstate')代替$location。它为我做了诀窍。

答案 6 :(得分:0)

这对我来说(在CoffeeScript中)

 $location.path '/url/path'
 $scope.$apply() if (!$scope.$$phase)

答案 7 :(得分:0)

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

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

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

旧代码:

taskService.createTask(data).then(function(code){
            $location.path("task/" + code);
        }, function(error){});

注意:taskService.createTask返回一个承诺。

$ q-使用promise的角度方式:

let dataPromises = [taskService.createTask(data)];
        $q.all(dataPromises).then(function(response) {
                let code = response[0];
                $location.path("task/" + code);
            }, 
            function(error){});

使用$ q来解决承诺,解决了重定向问题。

有关$ q服务的更多信息:https://docs.angularjs.org/api/ng/service/ $ q

答案 8 :(得分:-7)

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

它可以解决你的问题。