angular - Angular:反应形式是不可变的是什么意思?
问题描述
我目前正在学习 angular& 我正在阅读来自https://angular.io/guide/forms-overview的反应式表单和模板驱动表单之间的差异。该网站称反应式表单是不可变的,而模板驱动的表单是可变的。我真的不明白在这种情况下不可变是什么意思。我的意思是如果用户可以通过向表单控件提供值来更新表单的状态,那不是使表单可变吗?
解决方案
有很多关于 Angular 表单的文章。他们中的大多数只是简单地改写文档并稍微修改示例,而没有实际解释其含义。我不得不多次阅读 Angular 文档以试图理解它们的含义。我假设您熟悉可变性概念。
他们所说的可变/不可变是底层数据模型,而不是表单本身。即使这对我来说也不是 100% 清楚,因为有时他们会谈论表单模型。但关键区别在于,使用Reactive表单,您没有物化模型对象。相反,您有一组 FormControl,您可以通过 API 直接与之交互。在这种情况下,不可变并不意味着您不能更改属性/值。这意味着在基础模型的状态发生更改后,您正在使用该模型的新“实例”,该实例已与新值同步更新,并在任何时间点与 (UI) 控件保持一致。因此,事实的来源是形式模型。值得深入挖掘 Observables 以了解它是如何实现的。
使用模板驱动的表单,您无需访问或修改 FormControl。您在控制器中有视图模型对象和/或属性,它们通过 NgModel 指令链接到 UI。这些对象/属性可能会改变,这就是为什么他们谈论这种形式的可变性。更改检测是异步的,因此即使不太可能,在某个时间点,模板 (UI)、表单模型和视图(数据)模型也可能不对齐。
来自这篇文章: “第二个问题是双向绑定数据是可变的,这本质上意味着您不能保证在使用它时不会更改数据。我们永远无法确定如果是什么我们可以看到它是准确的,或者由于双向绑定的异步性质,在我们处理数据时它是否会发生变化。”
希望这可以帮助!
推荐阅读
- multithreading - csv 在线程或进程中写入函数:我应该使用哪个循环或任何其他建议?
- node.js - 在 New Relic 中记录自定义维度指标
- css - 如何使浮动元素的边距折叠
- blazor - Blazor w/Syncfusion - Microsoft.JSInterop.JSException:找不到“sfBlazor.methodCall”(“methodCall”未定义)
- nginx - NGINX 在 302 重定向时将端口更改为 80
- mysql - 尝试将 3 个表与内部连接连接在一起时出现错误 1052
- windows - 查看操作系统如何处理 Windows 系统调用
- python - 熊猫计算自值>当前单元格以来的行数
- python - 没有为 scs==2.1.4 找到匹配的分布
- reactjs - GraphQL gql 语法错误:
预期,得到'}'和未知字段