【问题标题】:Angular2 template forms - trying to understand the reset functionAngular2模板表单 - 试图了解重置功能
【发布时间】:2017-03-21 18:18:26
【问题描述】:

我已经按照模板表单的官方 Angular2 教程进行操作,但在理解原生 reset JavaScript 函数对 Angular2 ngModel 的作用时遇到了一些问题。虽然官方文档中没有明确说明,但我相信reset 将输入值设置为其默认值,即null

看起来是这样,因为在示例中,我们有一个newHero 函数:

newHero() {
    this.model = new Hero(42, '', '');
}

当我们“重置”表单时,这个函数会被调用:

<button type="button" class="btn btn-default" (click)="newHero(); heroForm.reset()">
    New Hero (official)
</button>

注意newHero 函数将属性namepower 设置为空字符串。但是由于这个函数执行后,我们也重置了表单heroForm.reset(),新的对象如下:

{ "id": 42, "name": null, "power": null, "alterEgo": null }

这很有趣,不是吗?由于null 不等于空字符串(Difference between null and empty string),我可以声称这是错误的。但它在官方的 Angular2 文档中,所以我不确定 - 我没有做对吗?

我把事情的调用顺序改成了这样:

 <button type="button" class="btn btn-default" (click)="heroForm.reset(); newHero()">
    New Hero (alt)
</button>

这实际上产生了正确的对象,即:{ "id": 42, "name": "", "power": "" }

现在想象一下,如果新对象有一个默认值,假设name 更改为Jessica Alba。 Angular 的官方示例会将这个值覆盖为 null,所以它引出了一个问题,为什么还要有一个重置模型的函数?

这是一个带有 2 个重置按钮的项目,官方和替代按钮(注意顶部的 model JSON):https://plnkr.co/edit/1w2SSv8qxpOCjfDaJxPz?p=preview

所以我的问题是:文档中的示例是错误的,还是我遗漏了什么? reset 函数是否真的将值更改为 null

【问题讨论】:

  • 我认为你想太多教程了。目的是帮助您开始使用 Angular 2。一旦您对框架感到满意,您就可以根据需要设置对象。例如,为新对象分配一个 id 没有任何意义,因为它通常是后端执行此操作,您可能会在保存数据之前对其进行检查......所以要回答您的问题,重置功能将分配您想要的为默认值(null、空字符串、预定义英雄技能等)
  • 我当然同意你的看法。我在这里吹毛求疵,但他们表示这一点的方式,newHero 函数没有意义。无论你在那里设置什么,它都会被覆盖。我认为更改顺序是有意义的(首先重置表单,然后调用函数)。我只能想象这会引起一些混乱。以我为例!

标签: javascript angular


【解决方案1】:

如果您查看 Angular 源代码,您会看到在 NgForm 实例上调用 reset() 然后调用 NgForm#resetForm(value: any = undefined) 进而调用 FormGroup#reset(记录在 here):

重置表单组。这意味着默认情况下:

  • 该组和所有后代都被标记为原始
  • 组和所有后代都标记为未触及
  • 所有后代的值将是 null 或 null maps

您还可以通过传入一个状态图来重置为特定的表单状态 匹配表单的结构,以控件名称作为键。

所以是的,默认情况下,在 NgForm 上调用 reset() 会将值重置为 null,无论 null 是否真的是根据您的应用程序的规范“初始值”。但是您可以通过使用 control name : initial value 值的映射调用 resetForm(value) 来覆盖此行为。

【讨论】:

  • 这回答了我的问题,并确认官方文档中的示例没有意义。如果您要在之后立即重置属性,为什么要调用设置属性的函数?谢谢!
猜你喜欢
  • 2018-12-17
  • 2019-03-12
  • 2012-06-13
  • 1970-01-01
  • 2021-11-02
  • 2017-01-07
  • 1970-01-01
  • 2016-10-31
相关资源
最近更新 更多