如何限制角度摘要仅影响/重新渲染一个组件/指令

2024-02-25

我正在开发一个有角度的应用程序/网站,现在才意识到,每当触发模型更改/摘要时,它都会导致整个页面重新渲染,这看起来既浪费又缓慢。

有没有办法导致/限制摘要仅影响它所使用的指令/控制器。

例如,如果我有一个带有 $interval 的“时钟”指令来计算页面上的毫秒数

$scope.page_stats = {"ms_on_page": 0};
$interval(function() {
    $scope.page_stats.ms_on_page+= 30;
}, 30);

我的应用程序布局如下所示

<body>
    <clock-directive></clock-directive>//<--gets rendered every 30ms
    some other html
    <some-slow-render-directive></some-slow-render-directive>
    // ^-- also gets rendered every 30ms
</body>

我如何阻止慢指令每 30ms 更新自身/其模板,并将时钟间隔摘要限制为时钟指令,因为我知道它不会在页面的任何其他部分使用。 (这不是我的实际应用程序,只是一个示例来说明我的问题)


Angular 会(通常)重新渲染所有内容$rootScope.$digest(),这被称为$scope.$apply(), $interval, 等等。

然而,有is您可以应用一种优化策略,仅重新渲染适用的部分(高频更新)。

首先,将你的观点分成不同的范围。例如,每 30 毫秒更新一次的计数器可以位于其自己的控制器中,通过 Heavy 指令将其与范围分开。

然后,使用非角度间隔(例如setInterval()) 更新你的值,然后调用$scope.$digest()手动。

例如:

JS:

app.controller('MainCtrl', function($scope, $interval) {
  // this is our "heavy" calculation function
  // it displays a Unix timestamp, which should change
  // every second if the function is continously executed
  $scope.calc = function() {
    // get time in seconds
    return Math.floor(new Date().getTime() / 1000);
  };
});

app.controller('ChildCtrl', function($scope, $interval) {
  $scope.counter = 0;

  // don't use $interval, it'll call $rootScope.$apply()
  // uncomment this and comment the setInterval() call
  // to see the problem
  //$interval(function() { $scope.counter++; }, 1000);

  setInterval(function() {
    $scope.counter++;

    // digest only our scope, without re-rendering everything
    $scope.$digest();
  }, 1000);
});

HTML:

<body ng-controller="MainCtrl">
  <!-- pretend this is our calculation that occurs often -->
  <p ng-controller="ChildCtrl">Interval counter: {{ counter }}</p>

  <!-- pretend this is our heavy calculation that we don't want to occur often -->
  <p>Heavy calc: {{ calc() }}</p>
</body>

Plunker http://plnkr.co/edit/iiek1WWDm2DKH2vjFiQ9

在这种情况下,假设calc()是重指令。您会注意到它仅评估一次,而不是每次计数器更新时。但是,如果您使用$interval,每次计数器更新时它都会更新。

请注意,您must use $scope.$digest()- 如果你使用$scope.$apply(),它会调用$rootScope.$digest(),这将更新所有内容。

进一步阅读here https://github.com/angular/angular.js/issues/5583.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何限制角度摘要仅影响/重新渲染一个组件/指令 的相关文章

随机推荐

  • Gradle 以非零退出值 1 完成

    我刚刚在 libgdx 中生成了一个项目并导入到 eclipse 编译了一些依赖项 现在我得到了 Error Gradle Execution failed for task android compileDebugAidl com and
  • 如何选择自动完成下拉列表中的第一个元素

    如果没有元素 任何人都可以帮助我如何选择自动完成下拉列表的第一个元素 被选中 我尝试使用自动对焦 为键盘事件工作 如果我使用鼠标 第一个元素不会选择自动聚焦的元素 visit here https stackoverflow com a 9
  • 在 Swift 中使用 NSURL 读取文本文件

    我想读取并显示位于 URL 的文本文件的内容 我正在为 Yosemite 编写 Mac 应用程序 我需要使用 Swift 但我坚持这样做 这是我的代码 let messageURL NSURL string http localhost 8
  • 任务并行库 INotifyPropertyChanged 不抛出异常?

    我有一个 wpf 项目 我在绑定到文本框的属性上使用 INotifyPropertyChanged 我正在使用任务 TaskParallelLibrary 在不同的线程上更新此值 它已正确更新并且不会引发异常 我认为它会抛出异常 因为它是在
  • Angular 4 - Http 请求错误:您在需要流的地方提供了“未定义”

    在尝试执行 HTTP Post 请求时 我收到以下错误 auth service ts c694 156 请求新的时出错 密码 错误消息 您在流所在位置提供了 未定义 预期的 您可以提供 Observable Promise Array 或
  • 如何使用uiwebview显示一些网页?

    如何使用 uiwebview 显示某个 url 请求的网页 我不知道该怎么做 谁能告诉我该怎么做 有开源的吗 谢谢 NSString urlAddress http www google com NSURL url NSURL URLWit
  • 如何更加重视机器学习中的某些特征?

    如果使用像 scikit learn 这样的库 如何为 SVM 这样的分类器的输入中的某些特征分配更多权重 这是人们做还是不做的事 首先 你可能不应该这样做 机器学习的整个概念是使用统计分析分配最佳权重 你在这里干扰了整个概念 因此你需要非
  • 将列表传递给 Tcl 过程

    将列表传递给 Tcl 过程的规范方法是什么 如果我能得到它 以便列表自动扩展为可变数量的参数 我真的很喜欢它 所以像这样 set a b c myprocedure option1 option2 a and myprocedure opt
  • 在 IE 和 Chrome 中上传之前预览图像

    我正在尝试设计一个模块 在用户将图像上传到数据库之前 我想在其中向用户显示图像的预览 我找到了一个适用于 Firefox 但不适用于 IE 和 Chrome 的解决方案 有人可以帮助我吗 这是我的代码 function imageURL i
  • 这个空白隐藏在哪里?

    我有一个字符向量 它是一些 PDF 抓取的文件pdftotext 命令行工具 一切都 幸福地 排列得很好 然而 该向量充满了一种空白类型 无法使用正则表达式 gt test 1 Address Clinic Information Stor
  • whereis python 和 python --version 之间的矛盾

    在一个 Python 环境中 我输入whereis python 并得到以下信息 python usr bin python2 6 usr bin python2 6 config usr bin python usr lib python
  • 如何通知用户NPM包版本更新?

    我用 Node JS 编写了一个 CLI 工具并发布到NPM https www npmjs com package rapid react 每次在终端中运行时 我都需要通知用户可用的新版本及其类型 补丁 次要 主要 以便他 她可以相应地更
  • 如何计算时间复杂度为 O(n log n) 的 XOR(二元)卷积

    是按位异或运算 我认为Karatsuba算法可能可以解决该问题 但是当我尝试在Karatsuba算法中使用XOR代替 时 很难得到子问题 The 卷积定理 https en wikipedia org wiki Convolution th
  • 为什么在 Python 中处理已排序数组并不比处理未排序数组快?

    在这篇文章中为什么处理排序数组比处理随机数组更快 https stackoverflow com questions 11227809 why is processing a sorted array faster than an unso
  • flink kafka生产者在检查点恢复时以一次模式发送重复消息

    我正在写一个案例来测试 flink 两步提交 下面是概述 sink kafka曾经是kafka生产者 sink stepmysql接收器是否扩展two step commit sink comparemysql接收器是否扩展two step
  • 如何构建多部分 MIME 请求并使用 AngularJS 的 $http 方法 POST 它?

    如何构建多部分 MIME 请求并使用 AngularJS http 方法将其 POST 到服务器 API 我正在尝试将图像上传到服务器 图片的二进制数据应该是body使用 POST 方法和多部分 MIME 完成请求 其余查询参数可以作为查询
  • 使用简单 Json 库提取 JSON 数组

    我的 JSON 数据如下所示 Users Username Admin1 Password 123 Username Admin2 Password 456 Username Admin3 Password 789 我正在尝试提取所有用户名
  • Java:如何从线程返回中间结果

    使用Java 7我正在尝试构建一个监视数据存储 某些集合类型 的观察程序 然后在某些点从其中返回某些项目 在本例中 它们是时间戳 当时间戳经过当前时间时 我希望将其返回到起始线程 请参阅下面的代码 Override public void
  • 通过 LDAP 连接到 Active Directory

    我想使用 C 连接到我们的本地 Active Directory 我发现了这个很好的文档 http ianatkinson net computing adcsharp htm 但我真的不知道如何通过 LDAP 连接 你们有人能解释一下如何
  • 如何限制角度摘要仅影响/重新渲染一个组件/指令

    我正在开发一个有角度的应用程序 网站 现在才意识到 每当触发模型更改 摘要时 它都会导致整个页面重新渲染 这看起来既浪费又缓慢 有没有办法导致 限制摘要仅影响它所使用的指令 控制器 例如 如果我有一个带有 interval 的 时钟 指令来