ngModel 指令在这个用例中究竟是如何工作的?

How exactly works ngModel directive in this use case?

我是 Angular 的完全初学者,我对 NgModel 指令及其可能的用例有一些概念上的疑问。

正在阅读 Angular 官方文档:https://angular.io/api/forms/NgModel

我只能阅读:

Creates a FormControl instance from a domain model and binds it to a form control element.

在我看来,这个 FormControl 应该是一个对象,其中包含插入到我的表单字段中的值和相关字段状态(例如用于验证目的)。这是正确的吗?现在我对具体用例有一些疑问。

所以让我们做一个例子。

我有这个表格:

<form (ngSubmit)="onSubmit(form)" #form="ngForm">
  <div class="form-group">
    <label for="name">Character Name</label>
    <input
      type="text"
      id="name"
      name="name"
      class="form-control"
      ngModel
      required
      #nameCtrl="ngModel">
    <span class="help-block" *ngIf="nameCtrl.invalid && nameCtrl.touched">Please, enter a name!</span>
  </div>

  <div class="form-group">
    <label for="side">Chose Side</label>
    <select name="side" id="side" class="form-control" ngModel>
      <option *ngFor="let option of availableSides" [value]="option.value">
        {{ option.display }}
      </option>
    </select>
  </div>

  <button class="btn btn-primary" type="submit" [disabled]="form.invalid">Add Character</button>
</form>
  1. 在我的父表单元素上我有:#form="ngForm"。具体说明什么?据我所知,它只是将整个表单的引用创建到 form "object"\reference.

  2. 然后我的表单中有这个 input 字段:

这里ngModel出现了两次:

为什么我有第一个 ngModel?具体是什么意思?

第二次出现的是 #nameCtrl="ngModel" 应该简单地在 nameCtrl[=49 中创建此输入字段的引用=] "address".

NgModel 指令从域模型创建 FormControl 实例并将其绑定到表单控件元素。没错。

在下面的所有示例中,NgModel 指令都应用于​​输入元素。

<input name="name" ngModel>

<input name="name" [ngModel]="someValue">

<input name="name" [(ngModel)]="someValue">

表示Angular上面的每个元素都会创建一个NgModel class的实例。

内部这个 class 持有 a new instance of FormControl

 public readonly control: FormControl = new FormControl(); 

如果需要,哪个值随后会更新并与模型、输入元素和其余表单同步。

接下来你需要了解的是template reference variable(#var)

这个变量帮助我们获取对某些实例的引用:HTMLElement 或 Angular Component/Directive/Service.

模板引用变量可以有一个值 #var="exportAsValue"。这使我们能够获得对特定实例的引用,例如我们向一个元素添加了指令,并希望我们的模板引用变量引用第一个指令。

对于这种情况,我们需要在@Directive装饰器定义中定义exportAs 属性:

@Directive({
  selector: '[myDir]',
  exportAs: 'myCoolDir'
})
export class MyDir {
  someProp: string;
}

现在,我们可以使用以下代码段获取对 MyDir 实例的引用:

<div myDir #someRef="myCoolDir">
   {{ someRef.someProp }}

回到你的例子:

  • #form="ngForm" 持有对 NgForm class

  • 的引用
  • #nameCtrl="ngModel" 持有对 NgModel class

  • 的引用

这意味着您可以访问 class 中的任何 properties/methods,例如 nameCtrl.invalidform.invalid

另请参阅: