我在提交表单后更改页面的网址时遇到问题。
以下是我的应用流程:
$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'];
有人可以帮帮我吗?
答案 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);
它可以解决你的问题。