有没有办法在没有角度进入无限消化循环的情况下调用history.pushState()
?
我试图将我的应用从后端路由迁移到前端路由,并且所有stackoverflow帖子/ google资源似乎都没有答案。
答案 0 :(得分:12)
这是我们在基于此github评论的Angular 1.2.16应用程序中所做的:https://github.com/angular/angular.js/issues/3924#issuecomment-48592773
$location.url(myNewUrl);
$location.replace();
$window.history.pushState(null, 'any', $location.absUrl());
此代码是控制器的一部分。 我正在使用它向网址添加查询参数,而不想重新加载页面。它适用于我们的情况。
答案 1 :(得分:7)
我最近自己遇到了这个问题的一个变种,这里没有任何答案可以帮助我。 for (int i = size()/2; i >= 0; --i)
{
heapify(i);
}
已定义,但仅在从控制台调用时才有效。通过在这里整合一些答案,我能够找到解决方案。这是我用来解决这个问题的代码:
heapify
我正在运行Angular 1.5.5。
答案 2 :(得分:2)
使用$ locationProvider html5Mode对象上的rewriteLinks选项:
pageModule.config(function($locationProvider) {
$locationProvider.html5Mode({
enabled: true,
requireBase: false,
rewriteLinks: false
});
});
之后,您应该能够正确使用$ location服务,例如:
this.$location.path("/mynewpath");
答案 3 :(得分:1)
我能够提出一个与角度1.2.15配合使用的解决方案。
它的要点是为每个链接添加target
属性,然后使用$location
服务更改位置。
根据当前的角度代码,将忽略具有目标属性的锚标记(请注意,此解决方案最终可能会中断)。
为此,请确保此javascript在 angular:
之前运行// prevent angular from taking over link clicks until we have frontend routing
$(document.documentElement).on("click","a",function(event) {
var elem = $(this), target = elem.attr("target");
if(!target) {
elem.attr("target","_self");
setTimeout(function() {
elem.removeAttr("target");
});
}
});
之后,配置您的位置提供程序以使用html5mode:
angular.module("App", ["App.controllers"]).config([
"$locationProvider", function($locationProvider) {
if (history.pushState) {
$locationProvider.html5Mode(true);
}
}
]);
现在,在您的控制器中,注入位置服务并正常使用它:
angular.module("App.controllers",[]).controllers("SomeController", ["$scope", "$location", function($scope,$location){
$scope.updateLocation = function() {
if (history.pushState) {
$location.path("/new/path/here");
}
};
}]);