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

sel*_*ary 9 javascript http digest angularjs

背景

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

if (!$rootScope.$$phase) $rootScope.$apply();  
Run Code Online (Sandbox Code Playgroud)

除了从我们的API中获取对象之外,我们的应用程序还有许多指令templateUrl- 通过角度使用获取$http.这会导致数以百计$digest冷启动循环.

注释出上述线,减少的数量$digest的循环至约3,和应用程序运行MUCH快,没有破碎的绑定(至少由于$http不触发$digest).

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

Ste*_*ell 0

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

例如:

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

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

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