$apply没有'无法处理“后退”按钮提示的位置更改

$apply doesn't work on location changes prompted by Back button

本文关键字:按钮 后退 提示 位置 处理 没有 apply      更新时间:2023-09-26

我正在将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(){vara=d.url(),b=h.$$replace;if(!l||a!=h.absUrl())l++,c.$evalAsync(function(){c.$broadcast(''"$locationChangeStart''",h.absUrl;h.$$replace=!1.回来l} ;newVal:18;oldVal:17"],["fn:函数(){vara=d.url(),b=h.$$replace;if(!l||a!=h.absUrl())l++,c.$evalAsync(function(){c.$broadcast(''"$locationChangeStart''",h.absUrl;h.$$replace=!1.回来l} ;newVal:19;oldVal:18"],["fn:函数(){vara=d.url(),b=h.$$replace;if(!l||a!=h.absUrl())l++,c.$evalAsync(function(){c.$broadcast(''"$locationChangeStart''",h.absUrl;h.$$replace=!1.回来l} ;newVal:20;oldVal:19"],["fn:函数(){vara=d.url(),b=h.$$replace;if(!l||a!=h.absUrl())l++,c.$evalAsync(function(){c.$broadcast(''"$locationChangeStart''",h.absUrl;h.$$replace=!1.回来l} ;newVal:21;oldVal:20"],["fn:函数(){vara=d.url(),b=h.$$replace;if(!l||a!=h.absUrl())l++,c.$evalAsync(function(){c.$broadcast(''"$locationChangeStart''",h.absUrl;h.$$replace=!1.回来l} ;newVal:22;oldVal:21"]]

有没有办法在Angular之外更改路线,并确保Angular正确更新ng视图?对上面的摘要错误有什么想法吗?

更新:通过关注locationChangeSuccess,我已经将问题缩小到$apply并不总是向Angular提交更改这一事实——更改它的代码肯定会运行,但Angular位置不会在范围内更新$应用程序仅在"上一步"按钮提示的位置更改时以这种方式开始失败。

基于您的更新:

范围内的角度位置未更新

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

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