ChatGPT解决这个技术问题 Extra ChatGPT

Angular2 如果在表单标签中使用 ngModel,则必须设置名称属性或表单

我从 Angular 2 收到此错误

core.umd.js:5995 例外:未捕获(承诺中):错误:app/model_exposure_currencies/model_exposure_currencies.component.html:57:18 中的错误,原因是:如果在表单标签中使用 ngModel,则 name 属性必须是set 或表单控件必须在 ngModelOptions 中定义为“独立”。

示例 1:

<input [(ngModel)]="person.firstName" name="first">

示例 2:

<input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone: true}"> 
<td *ngFor="let lag of ce.lags">
    <div class="form-group1">
        <input name="name" [(ngModel)]="lag.name" [ngModelOptions]="{standalone: true}"  class="form-control" pattern="[0-9]*(\.[0-9]+)?" required>
    </div>
</td>

这就是我使用表单标签的方式:

<form #f="ngForm" (ngSubmit)="onSubmit()">
考虑将其中一个答案作为正确答案

T
Top-Master

如果使用 ngForm,则所有具有 [(ngModel)]="" 的输入字段都必须具有带值的属性 name

<input [(ngModel)]="firstname" name="something">

独立

通过设置 [ngModelOptions]="{standalone: true}" 可以告诉 Angular,忽略表单和/或 ngForm,只需将其绑定到 firstname 变量即可。

但是,如果错误地使用了 form-tag(有时就像我的情况一样),将 form 更改为 div 是另一种选择(但前提是您的样式不需要 form-tag)。


在此 angular.io/docs/ts/latest/api/forms/index/… 中搜索“名称属性”
name 属性是否必须具有唯一值?
来自 Angular 5 文档 (angular.io/guide/forms):“在将 [(ngModel)] 与表单结合使用时,需要定义名称属性。”
也适用于 Angular 7!
我想补充一点,只有在 ngModel 位于名称之前,它才会起作用。
A
Ali Adravi

由于每个开发人员都有一个共同的习惯,不阅读完整的错误,只需阅读第一行并开始寻找其他人的答案:):) 我也是其中之一,这就是我在这里的原因:

阅读错误,清楚地说:

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

我们还需要了解这个错误吗?

使用任何一个选项,一切都会顺利进行。


对每种替代方案的含义/效果的解释将是有用的 - 任意选择两者中的一个似乎不是一个好主意。
以下是对 [ngModelOptions]="{standalone: true} 的一个很好的解释:stackoverflow.com/a/38368261/3135317。在我的例子中,当我有一个嵌套数组的 `*ngFor* 时,我得到了可怕的`ngModel 在表单标签中使用,或者 name 属性必须...` 错误。模型绑定很好,模板被拒绝了。 “示例 1”不能 有效; “示例 2”是完美的。
这个答案在同一周帮助了我两次(显然第一次没有坚持);)
正如答案中提到的,解决方案在于错误本身,我无法在第一眼看到它,正如答案中再次提到的那样:) 谢谢,它有效。
D
Deitsch

在我的情况下,发生错误是因为在 html 标记下面还有一行没有 name 属性。

<form id="form1" name="form1" #form="ngForm">
    <div class="form-group">
        <input id="input1" name="input1" [(ngModel)]="metaScript" />
        ... 
        <input id="input2" [(ngModel)]="metaScriptMessage"/>
    </div>
</form>

https://i.stack.imgur.com/WMKut.png


D
Deitsch

这两个属性都是必需的,并且重新检查所有表单元素是否具有“名称”属性。如果您使用表单提交概念,否则只需使用 div 标签而不是表单元素。

<input [(ngModel)]="firstname" name="something">

E
Eric

我注意到 Chrome 开发者工具有时只会在第一个元素下划线,即使它正确设置了名称也是如此。这让我有一段时间不高兴。

必须确保为表单上包含 ngModel 的每个元素添加一个名称,无论哪个元素带有波浪线下划线。


哇!谢谢!这花了我一段时间!
D
Deitsch

当您清楚地查看控制台时,它将为您提供两个示例。实施其中任何一个。

<input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone:true}">

或者

<input [(ngModel)]="person.firstName" name="first">

不要随便选一个,你要明白你在做什么
User2585,我同意你的观点,但你能详细说明一下区别吗?我发现每个人都建议使用“名称”属性。但是没有人解释使用“名称”属性的意义究竟是什么?
@PrajjwalGupta如果您希望ngModel成为ngForm的一部分,您需要给它(表单控件)一个名称,然后表单值将具有一个具有给定名称的属性(在这种情况下首先)与输入的值.如果由于某种原因您不希望 ngModel 成为 ngForm 的一部分,则可以指定 [ngModelOptions]="{standalone:true}",然后您没有名称
K
Kailas

修复很容易。

对我来说,我们在表格中有不止一个输入。我们需要隔离导致错误的输入/行并简单地添加 name 属性。这为我解决了这个问题:

前:

<form class="example-form">

    <mat-form-field appearance="outline">

      <mat-select placeholder="Select your option" [(ngModel)]="sample.stat"> <!--HERE -->

          <mat-option *ngFor="let option of actions" [value]="option">{{option}</mat-option>
      </mat-select>
    </mat-form-field>

    <mat-form-field appearance="outline">
      <mat-label>Enter number</mat-label>

      <input id="myInput" type="text" placeholder="Enter number" aria-label="Number"
        matInput [formControl]="myFormControl" required [(ngModel)]="number">  <!--HERE -->

    </mat-form-field>

    <mat-checkbox [(ngModel)]="isRight">Check!</mat-checkbox> <!--HERE -->

  </form>

之后:我刚刚为 selectcheckbox 添加了 name 属性,这解决了问题。如下:

<mat-select placeholder="Select your option" name="mySelect" 
  [(ngModel)]="sample.stat"> <!--HERE: Observe the "name" attribute -->

<input id="myInput" type="text" placeholder="Enter number" aria-label="Number"
        matInput [formControl]="myFormControl" required [(ngModel)]="number">  <!--HERE -->

<mat-checkbox name="myCheck" [(ngModel)]="isRight">Check!</mat-checkbox> <!--HERE: Observe the "name" attribute -->

如您所见,添加了 name 属性。不必与您的 ngModel 名称相同。只需提供 name 属性即可解决此问题。


J
João Paulo Paiva

你需要 import { NgForm } from @angular/forms in your page.ts;

代码 HTML:

<form #values="ngForm" (ngSubmit)="function(values)">
 ...
 <ion-input type="text" name="name" ngModel></ion-input>
 <ion-input type="text" name="mail" ngModel></ion-input>
 ...
</form>

在您的 Page.ts 中,实现您的函数来操作表单数据:

function(data) {console.log("Name: "data.value.name + " Mail: " + data.value.mail);}

I
Ilya Yevlampiev

对于不对错误消息本身感到恐慌,而只是在谷歌上搜索为什么 here 中的示例不起作用(即在输入字段中键入文本时不会发生动态过滤)的每个人:它会直到您在输入字段中添加名称参数后才能工作。没有任何东西可以解释为什么管道不工作,但是错误消息指向这个主题并根据接受的答案修复它使动态过滤器工作。


D
Deitsch

尝试这个...

<input type="text" class="form-control" name="name" placeholder="Name" required minlength="4" #name="ngModel" ngModel>
<div *ngIf="name.errors && (name.dirty || name.touched)">
    <div [hidden]="!name.errors.required" class="alert alert-danger form-alert">
        Please enter a name.
    </div>
    <div [hidden]="!name.errors.minlength" class="alert alert-danger form-alert">
        Enter name greater than 4 characters.
    </div>
</div>

J
John Baird

您没有提及您正在使用的版本,但如果您使用的是 rc5 或 rc6,那么“旧”样式的表单已被弃用。看看这个以获得有关“新”表单技术的指导:https://angular.io/docs/ts/latest/guide/forms.html


t
thnkr22

为了能够以您想要的形式显示信息,您需要为那些感兴趣的特定输入提供名称。我建议你有:

<form #f="ngForm" (ngSubmit)="onSubmit(f)"> ...
<input **name="firstName" ngModel** placeholder="Enter your first name"> ...

J
John Henckel

对我来说,解决方案非常简单。我将 <form> 标记更改为 <div> 并且错误消失了。


这是因为您要移除表单,从而移除表单提供的所有功能。
@astro8891 我不需要功能
A
Akitha_MJ
<select name="country" formControlName="country" id="country" 
       class="formcontrol form-control-element" [(ngModel)]="country">
   <option value="90">Turkey</option>
   <option value="1">USA</option>
   <option value="30">Greece</option>
</select>
name="country"
formControlName="country" 
[(ngModel)]="country" 

这些是在 formGroup 指令中使用 ngModel 需要做的三件事。

请注意,应使用相同的名称。


Z
Zia Khan

像这样在 ngmodel 字段中添加独立:true

 <mat-radio-group [(ngModel)]="gender" [ngModelOptions]="{standalone: true}">
                            <mat-radio-button value="Male">Male</mat-radio-button>    
                            <mat-radio-button value="Female">Female</mat-radio-button>  
                        </mat-radio-group>

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅