Angular2 Если ngModel используется в теге формы, должен быть установлен либо атрибут name, либо форма

Я получаю эту ошибку из Angular 2

core.umd.js: 5995 ИСКЛЮЧЕНИЕ: Uncaught (в обещании): Ошибка: ошибка в app / model_exposure_currencies / model_exposure_currencies.component.html: 57: 18 вызвано: Если ngModel используется в теге формы, атрибут имени должен быть 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()">

person Tampa    schedule 04.09.2016    source источник
comment
Козайдер признает один из ответов правильным   -  person G. Stoynev    schedule 30.01.2019


Ответы (14)


Если используется ngForm, все поля ввода с [(ngModel)]="" должны иметь атрибут имя со значением.

<input [(ngModel)]="firstname" name="something">
person Thyagarajan C    schedule 07.11.2016
comment
найдите 'атрибут имени' в этом angular.io/ документы / ts / latest / api / forms / index / - person Thyagarajan C; 15.03.2017
comment
должен ли атрибут имени иметь уникальное значение? - person Alexander Mills; 09.01.2018
comment
Из документации Angular 5 (angular.io/guide/forms): определение атрибута имени является требованием, когда используя [(ngModel)] в сочетании с формой. - person elshev; 03.02.2018
comment
Применимо и к Angular 7! - person coderpc; 05.02.2019
comment
этот ответ помог мне 2 раза, но почему важно указать имя - person saber tabatabaee yazdi; 18.08.2019
comment
Это (angular.io/guide/forms#the-ngform-directive) объясняет, как поле имени используется внутри - person rewolf; 12.09.2019
comment
Я хотел бы добавить, что это будет работать только в том случае, если ngModel будет первым перед именем. - person Ronald Abellano; 01.11.2019
comment
Все еще применимо к Angular 8 и Angular 9 !! :) - person Welyngton Dal Prá; 07.05.2020

Поскольку у каждого разработчика есть обычная привычка не читать полную ошибку, просто прочтите первую строку и начните искать ответ от кого-то другого :) :) Я тоже один из них, поэтому я здесь:

Прочтите ошибку, четко написав:

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

Что еще нам нужно, чтобы разобраться в этой ошибке?

Используйте любой один вариант, все будет работать гладко.

person Ali Adravi    schedule 29.09.2017
comment
Было бы полезно объяснить значение / эффект каждой альтернативы - выбор одного из двух произвольно не кажется хорошей идеей. - person Michael; 13.09.2018
comment
Вот хорошее объяснение [ngModelOptions]="{standalone: true}: stackoverflow.com/a/38368261/3135317. В моем случае я получил ужасную `ngModel, используемую в теге формы, либо атрибут name must ...` ошибка, когда у меня был `* ngFor * для вложенного массива. Связывание модели было в порядке, шаблон отключен. Пример 1 НЕ МОГЛИ работать; Пример 2 был идеальным. - person FoggyDay; 14.12.2019
comment
Этот ответ помог мне дважды за одну неделю (видимо, не прижился в первый раз);) - person Jay Cummins; 26.03.2020

В моем случае ошибка произошла из-за того, что ниже в разметке 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>

Но браузер по-прежнему сообщает об ошибке в первой строке. И трудно обнаружить источник ошибки, если у вас есть другие элементы между этими двумя. снимок экрана chrome devtools, показывающий ошибку

person elshev    schedule 17.01.2019

Оба атрибута необходимы, а также еще раз проверьте, что все элементы формы имеют атрибут name. если вы используете концепцию отправки формы, в противном случае просто используйте тег div вместо элемента формы.

<input [(ngModel)]="firstname" name="something">
person Vinayak Shedgeri    schedule 17.01.2018

Я заметил, что инструмент разработчика Chrome иногда подчеркивает только первый элемент ярко-красным цветом, даже если он правильно настроен с именем. Это на время сбило меня с толку.

Обязательно добавьте имя к каждому элементу формы, который содержит ngModel, независимо от того, какой из них подчеркнут волнообразно.

person Eric    schedule 25.06.2018
comment
Ух ты! Спасибо! Это заняло у меня время! - person Jens Mander; 29.12.2020

Если вы внимательно посмотрите на консоль, вы увидите два примера. Реализуйте любое из них.

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

или

<input [(ngModel)]="person.firstName" name="first">
person RAHUL KUMAR    schedule 20.12.2017
comment
Не выбирайте просто так, вы должны понимать, что делаете - person User2585; 16.03.2021

Это довольно легко исправить.

Для меня у нас было более одного ввода в форме. Нам нужно изолировать ввод / строку, вызывающую ошибку, и просто добавить атрибут 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>

После: я только что добавил атрибут name для select и checkbox, и это устранило проблему. Следующее:

<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 устранит проблему.

person Kailas    schedule 23.08.2019

Вам нужно импортировать {NgForm} из @ angular / forms в вашем 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);}
person João Paulo Paiva    schedule 05.05.2017

Для всех, кто не паникует из-за самого сообщения об ошибке, а просто ищет в Google объяснение, почему пример из здесь не работает (т.е. динамическая фильтрация не происходит, когда текст вводится в поле ввода): она не будет работать, пока вы не добавите параметр имени во вводе поле. Ничто не указывает на объяснение того, почему pipe не работает, но сообщение об ошибке указывает на эту тему, и ее исправление в соответствии с принятым ответом заставляет динамический фильтр работать.

person Ilya Yevlampiev    schedule 06.08.2019

Попробуй это...

<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>
person Sai Krishna    schedule 21.02.2018

Вы не упомянули версию, которую используете, но если вы используете rc5 или rc6, этот «старый» стиль формы устарел. Взгляните на это руководство по использованию "новых" техник форм: https://angular.io/docs/ts/latest/guide/forms.html

person John Baird    schedule 04.09.2016

Чтобы иметь возможность отображать информацию в желаемой форме, вам необходимо дать этим конкретным входным данным названия, представляющие интерес. Я бы порекомендовал вам иметь:


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

Для меня решение было очень простым. Я изменил тег <form> на <div>, и ошибка исчезла.

person John Henckel    schedule 18.12.2017
comment
Это связано с тем, что вы удаляете форму, тем самым удаляя все функции, которые она предоставляет. - person astro8891; 21.06.2018
comment
@ astro8891 мне не нужна функция - person John Henckel; 29.07.2019

<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" 

Это три вещи, которые необходимо использовать для использования ngModel внутри директивы formGroup.

Обратите внимание, что следует использовать то же имя.

person Akitha_MJ    schedule 23.04.2020