从Angular中无条件摘要成功调用history.pushState()?

时间:2014-04-07 13:41:40

标签: javascript html5 angularjs

有没有办法在没有角度进入无限消化循环的情况下调用history.pushState()

我试图将我的应用从后端路由迁移到前端路由,并且所有stackoverflow帖子/ google资源似乎都没有答案。

4 个答案:

答案 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");
      }
    };
  }]);