我正在努力将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 一个= d.url()中,b = H $$替换;如果(L || A = h.absUrl()!)升++,C $ evalAsync(函数(){C $广播(\“$。 ?locationChangeStart \”,h.absUrl()的一个).defaultPreventedħ$$解析(A):( d.url(h.absUrl(),b)中,I(A))}); H $$。取代= 1;!返回 升}; newVal:18; oldVal:17“],[”fn:function(){var 一个= d.url()中,b = H $$替换;如果(L || A = h.absUrl()!)升++,C $ evalAsync(函数(){C $广播(\“$。 ?locationChangeStart \”,h.absUrl()的一个).defaultPreventedħ$$解析(A):( d.url(h.absUrl(),b)中,I(A))}); H $$。取代= 1;!返回 升}; newVal:19; oldVal:18“],[”fn:function(){var 一个= d.url()中,b = H $$替换;如果(L || A = h.absUrl()!)升++,C $ evalAsync(函数(){C $广播(\“$。 ?locationChangeStart \”,h.absUrl()的一个).defaultPreventedħ$$解析(A):( d.url(h.absUrl(),b)中,I(A))}); H $$。取代= 1;!返回 升}; newVal:20; oldVal:19“],[”fn:function(){var 一个= d.url()中,b = H $$替换;如果(L || A = h.absUrl()!)升++,C $ evalAsync(函数(){C $广播(\“$。 ?locationChangeStart \”,h.absUrl()的一个).defaultPreventedħ$$解析(A):( d.url(h.absUrl(),b)中,I(A))}); H $$。取代= 1;!返回 升}; newVal:21; oldVal:20“],[”fn:function(){var 一个= d.url()中,b = H $$替换;如果(L || A = h.absUrl()!)升++,C $ evalAsync(函数(){C $广播(\“$。 ?locationChangeStart \”,h.absUrl()的一个).defaultPreventedħ$$解析(A):( d.url(h.absUrl(),b)中,I(A))}); H $$。取代= 1;!返回 升}; newVal:22; oldVal:21“]]
有没有办法改变Angular之外的路线,并确保Angular正确更新ng-view?关于上面的摘要错误的任何想法?
更新:通过watchChangeSuccess上的监视,我已经将问题缩小到$ apply并不总是将更改提交给Angular的事实 - 更改它的代码肯定会运行,但Angular位置不会更新范围。 $ apply仅在以后退按钮提示的位置更改时以这种方式失败。
答案 0 :(得分:1)
根据您的更新:
...角度位置未在范围
中更新
我在我的应用程序中遇到了类似问题,并通过$apply
调用$rootScope
解决了问题。尝试:
var rootScope = $injector.get('$rootScope');
rootScope.$apply(function () {
$location.path("/newurl");
});