我正在将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");
});