$ apply不适用于“后退”按钮提示的位置更改

时间:2013-11-21 08:37:25

标签: javascript angularjs

我正在努力将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仅在以后退按钮提示的位置更改时以这种方式失败。

1 个答案:

答案 0 :(得分:1)

根据您的更新:

  

...角度位置未在范围

中更新

我在我的应用程序中遇到了类似问题,并通过$apply调用$rootScope解决了问题。尝试:

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