【问题标题】:How exactly works ngModel directive in this use case?在这个用例中,ngModel 指令究竟是如何工作的?
【发布时间】:2020-08-21 08:36:16
【问题描述】:

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

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

我只能阅读:

从域模型创建一个 FormControl 实例并将其绑定到 表单控制元素。

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

让我们举个例子。

我有这个表格:

<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“地址”中。

【问题讨论】:

    标签: angular angular-directive angular-ngmodel


    【解决方案1】:

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

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

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

    这意味着对于上面的每个元素,Angular 都会创建一个NgModel class 的实例。

    这个类在内部持有a new instance of FormControl

     public readonly control: FormControl = new FormControl(); 
    

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

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

    这个变量帮助我们获取对某个实例的引用:HTMLElement 或 Angular 组件/指令/服务。

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

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

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

    现在,我们可以使用以下 sn-p 获取对MyDir 实例的引用:

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

    回到你的例子:

    • #form="ngForm" 持有对NgForm 类的引用

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

    这意味着您可以访问这些类的任何属性/方法,例如 nameCtrl.invalidform.invalid

    另见:

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 1970-01-01
      • 2018-01-04
      • 2017-11-15
      • 2018-04-03
      • 2018-03-06
      • 1970-01-01
      • 2018-01-19
      • 2021-01-27
      相关资源
      最近更新 更多