AngularJS $location 不改变路径

我有一个问题,改变网页的网址后,一个表单已经提交。

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

  1. 路由被设置,URL 被识别到某个表单页面。
  2. 页面加载,控制器设置变量,触发指令。
  3. 触发一个特殊的表单指令,该指令使用 AJAX 执行一个特殊的表单提交。
  4. 执行 AJAX 之后(Angular 不负责 AJAX) ,然后触发一个回调,指令调用设置位置的 $scope.onAfterSubmit函数。

问题是,在设置了位置之后,什么也没有发生。我也试过把定位参数设置成 /... 没有。我也试过不提交表格。什么都没用。

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

有人能帮帮我吗?

132055 次浏览

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

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

尝试使用 $scope.$apply()后,你已经改变了位置,并呼叫 replace(),让角度知道,事情已经改变。

我也有同样的问题,但是我对 $location 的调用已经在一个摘要中了。调用 $application ()只是给出了一个已经处于流程错误中的 $摘要。

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

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

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

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

应该能解决你的问题。

我没有使用 $location.path(...)来更改或刷新页面,而是使用了 $window服务。在 Angular 中,这个服务被用作 window对象的接口,而 window对象包含一个属性 location,该属性允许您处理与位置或 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-router,使用: $state.go('yourstate')而不是 $location

这对我很有用(在 CoffeeScript 中)

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

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

通常,当 $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 解决承诺解决了重定向问题。

更多关于 $q 服务的资料: https://docs.angularjs.org/api/ng/service/ $q