我正在将Angular集成到旧版应用程序中。这需要从控制器外部更新路由,因为旧应用程序在Angular之外具有LoadPage脚本,该脚本必须在设置浏览器URL之前执行一些功能。

要更改Angular路线,我需要遵循以下原则:

var $injector = angular.element($("#angularApp")).injector();
var $location = $injector.get('$location');
var scope = angular.element($("#angularApp")).scope();
scope.$apply(function () {
    $location.path("/newurl");
});


如果用户在应用程序中单击,则效果很好,但是使用后退按钮时,它无法更改模板(即使LoadPage脚本再次运行并且我的日志表明它确实运行了上面的代码)。同样,在某些情况下,一旦使用后退按钮,单击链接将给我带来可怕的摘要错误:


  未捕获的错误:达到10个$ digest()迭代。流产!观察者
  在最近5次迭代中触发:[[“ fn:function(){var
  a = d.url(),b = h。$$ replace; if(!l || a!= h.absUrl())l ++,c。$ evalAsync(function(){c。$ broadcast(\“ $ locationChangeStart \“,h.absUrl(),a).defaultPrevented?h。$$ parse(a):( d.url(h.absUrl(),b),i(a))}); h。$$替换=!1;返回
  l}; newVal:18; oldVal:17“],[” fn:function(){var
  a = d.url(),b = h。$$ replace; if(!l || a!= h.absUrl())l ++,c。$ evalAsync(function(){c。$ broadcast(\“ $ locationChangeStart \“,h.absUrl(),a).defaultPrevented?h。$$ parse(a):( d.url(h.absUrl(),b),i(a))}); h。$$替换=!1;返回
  l}; newVal:19; oldVal:18“],[” fn:function(){var
  a = d.url(),b = h。$$ replace; if(!l || a!= h.absUrl())l ++,c。$ evalAsync(function(){c。$ broadcast(\“ $ locationChangeStart \“,h.absUrl(),a).defaultPrevented?h。$$ parse(a):( d.url(h.absUrl(),b),i(a))}); h。$$替换=!1;返回
  l}; newVal:20; oldVal:19“],[” fn:function(){var
  a = d.url(),b = h。$$ replace; if(!l || a!= h.absUrl())l ++,c。$ evalAsync(function(){c。$ broadcast(\“ $ locationChangeStart \“,h.absUrl(),a).defaultPrevented?h。$$ parse(a):( d.url(h.absUrl(),b),i(a))}); h。$$替换=!1;返回
  l}; newVal:21; oldVal:20“],[” fn:function(){var
  a = d.url(),b = h。$$ replace; if(!l || a!= h.absUrl())l ++,c。$ evalAsync(function(){c。$ broadcast(\“ $ locationChangeStart \“,h.absUrl(),a).defaultPrevented?h。$$ parse(a):( d.url(h.absUrl(),b),i(a))}); h。$$替换=!1;返回
  l}; newVal:22; oldVal:21“]]


有没有办法改变Angular以外的路线,并确保Angular正确更新ng-view?关于上面的摘要错误有任何想法吗?

更新:通过对locationChangeSuccess的监视,我将问题缩小到以下事实:$ apply并不总是将更改提交给Angular -更改它的代码肯定可以运行,但是Angular位置不会在范围内更新。 $ apply仅在后退按钮提示的位置更改时以这种方式开始失败。

最佳答案

根据您的更新:


  ...范围中的角位置未更新


我的应用程序中有类似的问题,可以通过从$apply调用$rootScope来解决。尝试:

var rootScope = $injector.get('$rootScope');
rootScope.$apply(function () {
    $location.path("/newurl");
});

10-07 17:53