Angular 中的变更检测 API 底层架构

2023-12-06

我正在阅读这篇文章,并对更改检测操作的工作原理感到困惑。https://vsavkin.com/change-detection-in-angular-2-4f216b855d4c

这个概念:

Angular 表示它不会进行脏检查,也没有像 AngularJS 1.X 中那样进行两次绑定和监视。然而,我从文档和一些博客+堆栈中了解到,每个组件都附加了一个更改检测器。

然而,从这个堆栈溢出与 @Gunter 的响应在这里:了解 Angular 2 中的变化检测

使用 ChangeDetectionStrategy.OnPush Angular 运行更改检测,当 @Input() 更新时,接收到 Angular 侦听的 DOM 事件,或者异步管道 (| async) 接收到新值。

据我所知,它有一个监听器,可以监听角度的每一个变化。其次,如果我使用 runOutsideAngular,它不会在该组件或操作上创建更改检测器对象吗?

其他情况是,如果您显式 (this.zone.runOutsideAngular()) 或由于某些其他原因在 Angulars 区域之外运行的代码会修改组件的状态,则这也不会被覆盖(即使代码是事件处理程序)。

变更检测器生命周期的小子问题:

问题一:是有一个观察者还是一个事件监听者?

问题2:这是否意味着无论我们使用changeDetectorStartegy.onPush还是.Default,每个组件都有一个活动的变更检测器对象?

问题3:如果 Angular 应用程序中有 1000 个组件对象,那么每个组件实现中的这些变更检测器对象有何影响?特别是对于应用程序的内存配置文件

问题4:如何管理它,使其不会影响浏览器中应用程序的内存配置文件

问题5:是否有一个地方/资源可以获取关联的变更检测器和 ngZone 的生命周期?

更新:请求某人而不是将这个问题标记为 关闭 我建议回答一个严肃的问题。我很欣赏 您帮助理解基本的工作概念。


这是一个相当广泛的问题 - 这两篇文章应该可以让您很好地理解:

  • Angular 的 $digest 在 Angular 新版本中重生
  • 关于 Angular 中的变更检测您需要了解的一切

问题1:是有观察者还是事件 听众?

问题2:是否意味着有主动变化检测器 每个组件的对象,无论我们使用 ChangeDetectorStartegy.onPush 或 .Defau

不,变化检测器不是监听器。 Angular 中的每个组件都表示为一个视图。因此,该应用程序是一个视图树。当您在组件中注入 ChangeDetectorRef 时,您实际上是在该视图周围注入一个包装器。每个视图都有一个状态,指示是否应检查该视图上的绑定。 OnPush 只是将此状态设置为disabled因此不会对视图/组件执行任何检查。如果绑定发生变化,Angular 会将状态设置为 CheckOnce,以便视图仅检查一次,直到下次绑定发生变化。

问题 3:这些变化检测器对象有什么影响? 如果我有 1000 个组件对象,则每个组件实现 角度应用?特别是对于内存配置文件 应用

问题4:如何管理才能不影响内存 浏览器中应用程序的配置文件

正如我上面所解释的,不存在单独的变化检测器这样的东西。它是视图的包装。视图无论如何都存在,因为它是 Angular 在底层表示组件树的方式。

是否有地方/资源可以获取变更的生命周期 检测器和 ngZone 相关吗?

变更检测器不存在生命周期之类的东西。

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

Angular 中的变更检测 API 底层架构 的相关文章

  • 决策树和规则引擎 (Drools)

    In the application that I m working on right now I need to periodically check eligibility of tens of thousands of object
  • Spark scala 模拟 Spark.implicits 用于单元测试

    当尝试使用 Spark 和 Scala 简化单元测试时 我使用 scala test 和mockito scala 以及mockito Sugar 这只是让你做这样的事情 val sparkSessionMock mock SparkSes
  • Chrome 调试器注入 javascript

    我有这样的好奇心 是否可以以某种方式在我的页面中注入 javascript 并执行它并调试它 正如您在控制台中所做的那样 但在控制台中您无法暂停并观察变量 是否可以调试我通过控制台输入的代码 为什么无法调试通过 XHR 接收的代码 Than
  • mybatis:使用带有 XML 配置的映射器接口作为全局参数

    我喜欢使用 XML 表示法来指定全局参数 例如连接字符串 我也喜欢 Mapper 注释 当我尝试将两者结合起来时 我得到这个例外 https stackoverflow com questions 4263832 type interfac
  • 使用 Ruby aws-sdk 跟踪文件到 S3 的上传进度

    首先 我知道SO中有很多与此类似的问题 在过去的一周里 我读了大部分 如果不是全部 但我仍然无法让这项工作为我工作 我正在开发一个 Ruby on Rails 应用程序 允许用户将 mp3 文件上传到 Amazon S3 上传本身工作正常
  • 如何在连接到 Heroku PostgreSQL 的 Flask 应用程序上处理更多并发用户?

    Heroku 上的 Flask API 有许多端点 它们在将 json 化结果返回给客户端之前在我的 Heroku PostgreSQL 数据库上运行查询 我当前的计划是 Hobby Basic 层 因此数据库最多只能处理 20 个连接 如
  • Matplotlib loglog 的错误刻度/标签(双轴)

    我正在使用 matplotlib 创建对数图 如下图所示 默认刻度选择得很糟糕 充其量是这样 右边的 y 轴甚至根本没有 在线性等效中确实如此 而两个 x 轴都只有一个 有没有办法获得合理数量的带有标签的刻度 without为每个情节手动指
  • Jquery 以编程方式更改

    文本

    编辑 解决方案是将其添加到个人资料页面而不是性别页面 profile live pageinit function event p pTest text localStorage getItem gender 我在列表视图中有一个带有一些文
  • 如何为命令 stdout 添加 [stdout] 和 [stderr] 前缀?

    使用命令结构 https doc rust lang org std process struct Command html 如何向 stdout 和 stderr 缓冲区添加前缀 我希望输出看起来像这样 stdout things are
  • $ 在 JQuery 中意味着什么

    在下面的 var obj one 1 two 2 three 3 four 4 five 5 each obj function i val console log val 这里是什么意思 是对象吗 是一个别名jQuery对象 函数 它充当
  • 如何将 SQLite 数据库捆绑到 Go 二进制文件中?

    我尝试使用 go bindata 和 packr 但这些包没有显示如何将 SQLite 数据库文件打包到二进制文件中 我不需要以任何方式更新数据库 我只想在启动时从中读取数据 如何将 SQLite 数据库文件嵌入到 Go 二进制文件中 SQ
  • 如何禁用 solr 管理页面

    对于生产来说 拥有一个甚至不要求登录凭据的 solr 管理员感觉不安全 如何禁用默认的 solr 管理页面 我只是希望我的 web 应用程序使用 Solr 进行搜索词索引 我强烈建议保留管理页面用于调试目的 它在很多情况下拯救了我 有多种方
  • 进程被杀死后不会调用 onActivityResult

    我有一个主要活动 Main 和另一个活动 Sub 由 Main 调用 startActivityForResult new Intent this SubActivity class 25 当我在 Sub 时 我终止该进程 使用任务管理器或
  • java中void的作用是什么?

    返回类型 方法返回值的数据类型 如果方法不返回值 则返回 void http download oracle com javase tutorial java javaOO methods html http download oracle
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe
  • 描述符“join”需要“unicode”对象,但收到“str”

    代码改编自here http wiki geany org howtos convert camelcase from foo bar to Foo Bar def lower case underscore to camel case s
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic
  • 对象指针值作为字典的键

    我想使用对象的引用值作为字典的键 而不是对象值的副本 因此 我本质上想在字典中存储与另一个对象的特定实例关联的对象 并稍后检索该值 这可能吗 是不是完全违背了NSDictionary的理念 我可以看出我可能以错误的方式处理这个问题 因为字典
  • HTML 表格 - 固定列宽和多个可变列宽

    我必须建立一个有 5 列的表 表格宽度是可变的 内容宽度的 50 有些列包含固定大小的按钮 因此这些列应该有一个固定大小 例如 100px 有些列中有文本 所以我希望这些列具有可变的列宽 例如 Column1 tablewidth sum
  • R data.table 1.9.2 关于 setkey 的问题

    这似乎是 1 8 10 后引入的一个错误 与包含列表的 DT 的 setkey 相关 运行下面两个代码来查看问题 library data table dtl lt list dtl 1 lt data table scenario 1 p

随机推荐

  • 在智能卡上上传 .cap 文件?

    我有一张新卡 其 ATR 代码如下 3B 68 00 00 00 73 C8 40 12 00 90 00 我在谷歌上搜索了这张ATR 最后我知道这是一张 巴西电子公积金卡 问题是我该如何使用这张卡 我的意思是它支持哪些 APDU 有它的数
  • PHP - 使用表单输入中的 id 制作 switch 语句

    我正在用 PHP 做一个简短的测验 根据 4 个是 否问题告诉你你想到的生物是什么 我这样做是为了根据您对每个问题的回答 您会遇到不同的问题 我主要使用 switch 语句来完成此操作 我的问题是有什么方法可以使用条件作为表单提交按钮的 i
  • Flutter 蓝牙热敏打印机集成

    我有一个 flutter 食品配送应用程序 除此之外 我还有一个单独的餐厅应用程序 我可以在其中接受和拒绝订单 我很长一段时间以来一直在尝试做一些事情 以便当餐厅接受订单时 蓝牙热敏打印机会自动打印出一张收据 我找到了很多代码 但我不明白如
  • Powershell:将 pracl 命令的输出通过管道传输到数组

    pracl 是一个 sysinternal 命令 可用于列出目录的 ACL 我有一个共享列表 我想创建一个 csv 文件 这样对于每个 ACL 条目 我希望共享路径位于一列中 共享权限位于下一列中 我试图通过使用以下代码来做到这一点 inp
  • 数组到 SVG,使用 PHP 的灵活算法

    问题 我有几个不同的数组 例如 0 21 0 001 0 0245 0 31 0 05 1234 1342 1232 1625 2200 2205 1804 5 12 42 2 32 42 my problem now is I m loo
  • 在 Python 中索引浮点值

    我有一个从数据结构生成的浮点数列表 它是一个字典列表 即我已经迭代了整个列表并选择了给定字典中的某些值 现在 我想实际对这些数据点做一些事情 为此我需要对原始位置的一些参考 我尝试简单地使用数据点作为关键 但在尝试和失败之后 我进行了一些挖
  • Google VR Unity Divider、设置和后退按钮隐藏在 v0.9 中

    有谁知道如何禁用最新的 google vr sdk for unity 中的分隔符 设置和后退按钮 我尝试将 NativeUILayerSupported 设置为 false 并将返回值放入旧的 DrawUILayer 中 但它仍然显示 看
  • Web Api - 使用 [FromBody] 属性和 POST 方法时操作参数为空

    我有这个控制器 但我不明白为什么name参数为空 public class DeviceController ApiController HttpPost public void Select FromBody string name pr
  • 全透明OpenGL模型

    解释一下我做错了什么 我已将 3D 模型加载到自编码的 opengl 渲染 v 3 3 中 并尝试使用顶点着色器使其像 xray 效果一样透明 version 330 attribute vec3 coord3d attribute vec
  • Python 通过请求更改 Instagram 个人资料图片

    我正在尝试使用 python post 请求更改我的 Instagram 个人资料图片 但它没有改变 我没有收到任何错误 在回复中 它说他们已经更改了它 但是更改为白色 Instagram 人物照片 而不是我选择的照片 request ur
  • 为什么不能从 ArrayAdapter 添加/删除项目?

    我正在使用一个ArrayAdapter
  • SQL Server 长查询中的表锁 - 解决方案:NoLock?

    我的应用程序中的报告运行一个需要 5 15 秒的查询 仅限于将返回的行数 该查询对我的应用程序的几乎所有主表 客户 销售 单位等 有 8 个联接 一个小工具向我展示 此时 所有这 8 个表都被共享表锁锁定 也就是说 此时不会进行任何更新操作
  • targetSdkVersion 26 在崩溃报告中给出异常

    根据到 2018 年 11 月将目标 SDK 版本更新到 26 的要求 我在几个月前尝试更新我的 gradle 文件并发布了我的应用程序的新版本 将目标 sdk 和编译 sdk 版本更新为 26 从 23 之后 一天之内 我开始在 Fire
  • 未找到 Gradle DSL 方法:“classpath()”

    项目 FeedBack 可能使用不包含该方法的 Android Gradle 插件版本 例如 在 1 1 0 中添加了 testCompile 修复插件版本并同步项目 项目 FeedBack 可能使用不包含该方法的 Gradle 版本 打开
  • 请指出我学习异步Javascript过程中的错误

    我是 Javascript 和异步编程的新手 有些事情让我感到困惑 请指出我学习中的错误 异步函数的回调被放入消息队列中 通过事件循环执行 异步执行是非阻塞的 完成 通过事件循环 功能类似于setTimeout是异步的 异步函数是阻塞的 只
  • 创建不可移动类型的 std::vector

    我有一个std vector named args 我不知道编译时向量的大小 和不可移动类型NonMoveable 我想创建一个与 args 大小相同的向量 因此它等于 NonMovable args 0 additional arg No
  • git log 并在裸仓库上显示

    我在家里本地网络的文件服务器上创建了一个裸存储库 之后 我将现有存储库的一个分支从我的桌面电脑推送到这个新的远程存储库 推送工作完美 似乎所有数据都已到达 gitbranch va 给了我正确的数据 但我无法在裸存储库上使用 git log
  • 某些 bash 脚本中使用的“function”关键字是什么?

    例如 Bash Prog 简介 HOWTO function foo 我在以下位置进行搜索查询info bash并查看 POSIX 的相关章节function关键字但没有找到 What is function某些 bash 脚本中使用的关键
  • Kubernetes 滚动更新是否可以从服务负载均衡器中优雅地删除 Pod

    负载均衡器后面的主机滚动更新的标准做法是优雅地停止轮换主机 这可以通过将主机标记为 不健康 并确保主机不再接收来自负载均衡器的请求来完成 Kubernetes 是否会对由 ReplicationController 管理并为 LoadBal
  • Angular 中的变更检测 API 底层架构

    我正在阅读这篇文章 并对更改检测操作的工作原理感到困惑 https vsavkin com change detection in angular 2 4f216b855d4c 这个概念 Angular 表示它不会进行脏检查 也没有像 An