有没有办法在每个$http.get上禁用$digest的触发

Is there a way to disable triggering of $digest on every $http.get?

本文关键字:digest http 有没有 get      更新时间:2023-09-26

背景

angular的$http服务在每个get上触发$digest(如果没有$digest已经运行):

if (!$rootScope.$$phase) $rootScope.$apply();  

Ia除了从我们的API获取对象外,我们的应用程序还有许多带有templateUrl的指令,这些指令是通过使用$http的angular获取的。这导致冷启动时有数百个$digest循环。

注释掉上面的行,将$digest循环的数量减少到大约3个,应用程序运行MUCH更快,没有绑定中断(至少是因为$http没有触发$digest)。

问题

有没有办法禁用触发$digest的$http?

在应用程序配置中使用$httpProvider.useApplyAsync(true);。则10ms内加载的templates指令将面临相同的摘要。这将减少摘要循环调用。请参阅此处

可能无法直接执行您想要的操作,但您可以限制这些摘要周期的影响。尝试在页面的大部分区域放置<div ng-if="everythingLoaded">,并在所有$http调用完成后将everythingLoaded设置为true。

例如:

var p1 = $http.get(...);
var p2 = $http.get(...);
Promises.all([p1, p2]).then(function() {
  $scope.everythingLoaded = true;
});

摘要循环仍将运行,但速度会快得多,因为ng-if将消除对DOM和大部分控制器的影响,直到条件变为真。

我非常确信使用模板缓存将解决模板加载问题,假设这在最近的angular版本中仍然是一个问题。