AngularJS$位置未更改路径
我在提交表单后更改页面URL时遇到问题 以下是我的应用程序流程:AngularJS$位置未更改路径,angularjs,Angularjs,我在提交表单后更改页面URL时遇到问题 以下是我的应用程序流程: 路由被设置,URL被识别到某个表单页面 页面加载、控制器设置变量、指令被激发 触发一个特殊表单指令,该指令使用AJAX执行特殊表单提交 在执行AJAX之后(Angular不负责AJAX),将触发回调,指令将调用设置位置的$scope.onAfterSubmit函数 问题是,在设置了位置之后,什么也没有发生。我也尝试过将location参数设置为/。。。不。我也试着不提交表格。什么都不管用 我已经测试过代码是否在提交后到达onAft
$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'];
有人能帮我吗?几天前我也遇到过类似的问题。在我的例子中,问题是我用第三方库(确切地说是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){});