Angular2:使用 [(ngModel)] 和 [ngModelOptions]="{standalone: true}" 链接到对模型属性的引用

问题描述 投票:0回答:5

假设我有一个 Mailtype 类型的打字稿对象,如下所示:

export class Mailtype {
  constructor(
    public name?: string,
    public locale?: string,
    public email?: string,
    public properties? : Property[]
  ) {  }
}

其“properties”字段是 Property 类型的数组:

export class Property {
  constructor(
    public name?: string,
    public type?: string,
    public example?: string,
    public required?: boolean,
    public masked?: boolean
  ) {  }
}

现在在我的组件中,我有一个 Mailtype 对象,并且 html 有一个表单元素,用于编辑和添加到 Mailtype 的属性数组:

<form>
   <tr *ngFor="let property of model.properties; let i=index">
          <td>
            <input type="text" [(ngModel)]="property.name" required>
          </td>
  </tr>
  <button (click)="onAddProperty()">Add property</button>
</form>

组件:

export class MailtypeComponent {
  model : Mailtype;
  constructor() {
    this.model = new Mailtype('','','',[]);
    this.model.properties.push(new Property());
  }

  onAddProperty() {
    this.model.properties.push(new Property());
  }
}

我想知道是否不允许使用 [(ngModel)] 链接到数组中数组元素的引用“属性”,特别是在迭代数组的同时?因为上面的代码会抛出以下错误:

ORIGINAL EXCEPTION: If ngModel is used within a form tag, either the name attribute must be set
                      or the form control must be defined as 'standalone' in ngModelOptions.

                      Example 1: <input [(ngModel)]="person.firstName" name="first">
                      Example 2: <input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone: true}">

所以建议我使用

[ngModelOptions]="{standalone: true}"
或在 html 中添加名称字段。看起来
[ngModelOptions]="{standalone: true}"
在这种情况下有效。因为我找不到任何有关它的文档,所以
standalone: true
实际上意味着什么?

angular typescript angular-ngmodel
5个回答
97
投票

使用

@angular/forms
当您使用
<form>
标签时,它会自动创建
FormGroup

对于每个包含的

ngModel
标记为
<input>
,它将创建一个
FormControl
并将其添加到上面创建的
FormGroup
中;该
FormControl
将使用属性
FormGroup
命名为
name

示例:

<form #f="ngForm">
    <input type="text" [(ngModel)]="firstFieldVariable" name="firstField">
    <span>{{ f.controls['firstField']?.value }}</span>
</form>

说到这里,你的问题的答案如下。

当您将其标记为

standalone: true
时,这种情况不会发生(它不会添加到
FormGroup
中)。

参考:https://github.com/angular/angular/issues/9230#issuecomment-228116474


10
投票

对我来说代码:

<form (submit)="addTodo()">
  <input type="text" [(ngModel)]="text">
</form>

抛出错误,但我在输入中添加了名称属性:

<form (submit)="addTodo()">
  <input type="text" [(ngModel)]="text" name="text">
</form>

它开始起作用了。


2
投票

如果您不想使用表格

        <mat-form-field appearance="none" class="some-class">
          <mat-select class="some-class-2" placeholder="Select" 
           [(ngModel)]="selectedItem" 
           (ngModelChange)="onSelectItem($event)" [ngModelOptions]=" 
             {standalone: true}">
             <mat-option *ngFor="let item of itemOptions" 
               [value]="item.id">{{item.name}}</mat-option>
          </mat-select>
        </mat-form-field>

0
投票
  <input
    type="text"
    matInput
    placeholder="Ex. Sample Title"
    [(ngModel)]="createNewBlog.BlogDescription"
    required
    name="text"
  />

-1
投票

<form (submit)="addTodo()">
  <input type="text" [(ngModel)]="text">
</form>

© www.soinside.com 2019 - 2024. All rights reserved.