模板驱动形式和反应形式之间的实际区别是什么?


157

我一直在阅读有关Angular2新Forms API的信息,似乎在表单上有两种方法,一种是模板驱动的表单,另一种是反应性或模型驱动的表单。

我想知道两者之间的实际区别,不是语法上的区别(显然),而是实际用途,以及哪种方法在不同情况下的好处更大。此外,选择一个而不是另一个是否会提高性能?如果是,为什么?


3
要考虑的另一点是,反应式是同步的,模板驱动式是异步的。两种形式都有其自身的弱点和优点,因此在选择在应用程序中使用哪种形式之前,需要考虑几件事。应用程序的复杂性等。您也可以在应用程序中使用这两种形式。
维杰·辛格

Answers:


171

模板驱动的表单功能

  • 易于使用
  • 适用于简单方案,不适用于复杂方案
  • 类似于AngularJS
  • 双向数据绑定(使用[(NgModel)]语法)
  • 最少的组件代码
  • 自动跟踪表单及其数据(由Angular处理)
  • 单元测试是另一个挑战

响应式表单功能

  • 更灵活,但需要大量练习
  • 处理任何复杂的情况
  • 没有完成数据绑定(大多数开发人员首选不可变数据模型)
  • 更多的组件代码和更少的HTML标记
  • 可以进行反应性转换,例如
    • 根据去抖时间处理事件
    • 当组件不同时处理事件直到更改
    • 动态添加元素
  • 单元测试更轻松

1
单元测试的缺点仍然适用于模板驱动表单吗?
危险89年

@ danger89我想是的。对于模板驱动的表单,单元测试之所以存在问题,是因为它们是值更改,而有效性检查是异步的,这在单元测试时可能会引起头痛。
亚历克斯·洛克伍德

2
我将表单验证添加到上述组合中。模板通过指令验证,其中指令通过功能进行响应
Kieran

11
提到反应形式时,“处理任何复杂的情况”到底是什么意思?来自AngularJS,我已经构建了复杂的表单,所以很难看到模板驱动的表单如何“针对复杂的场景失败”
jtate 18/12/12

@jtate我同意您的观点jtate,有人对提高性能,加载时间等有什么想法吗?
乔尔·约瑟夫,

24

我认为这是关于代码策略用户体验的讨论。

综上所述,我们更改模板驱动的做法,是比较容易的工作吧,以反应性的给我们(在模型驱动的方法)更多的控制权,这导致更好的可测试的形式,通过利用HTML之间的解耦(设计/ CSS团队可以在这里工作)和组件的业务规则(Angular / js专家成员),并通过诸如响应式转换,相关验证之类的功能来改善用户体验,并处理复杂的场景,如运行时验证规则和动态字段重复。

本文对此有很好的参考: Angular 2表单-模板驱动和模型驱动方法



3

反应形式:

  • 可重用
  • 更强大
  • 可测试的
  • 更可扩展

模板驱动的表单:

  • 容易添加,
  • 扩展性较差,
  • 基本表格要求

总而言之,如果表单对您的应用程序非常重要,或者在应用程序中使用了响应式模式,则应使用响应式表单;否则,您的应用程序对登录等表单具有基本和简单的要求,则应使用模板驱动的表单

有一个官方的角度链接


0

了解反应式表格和模板驱动式表格之间区别的最简单方法

我可以说如果您想获得更多控制和可扩展性,请使用反应式表单

在此处输入图片说明


0

模板驱动形式:

使用FormsModule导入

使用ngModel指令构建的表单只能在端到端测试中进行测试,因为这需要存在DOM

表单值将在两个不同的位置可用:视图模型即ngModel

表单验证,因为我们向字段添加了越来越多的验证器标签,或者当我们开始添加复杂的跨字段验证时,表单的可读性降低了

反应形式:

一般可用于大型应用

复杂的验证逻辑实际上更易于实现

使用ReactiveFormsModule导入

表单值将在两个不同的地方可用:视图模型和FormGroup

易于进行单元测试:我们可以通过实例化类,在表单控件中设置一些值并针对表单全局有效状态和每个控件的有效性状态执行断言来做到这一点。

使用可观察对象进行反应式编程

例如:密码字段和密码确认字段必须相同

反应式:我们只需要编写一个函数并将其插入FormControl

模板驱动方式:我们需要定义一个指令,并以某种方式将两个字段的值传递给它

https://blog.angular-university.io/introduction-to-angular-2-forms-template-driven-vs-model-driven/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.