Angular2 Якщо ngModel використовується в тезі форми, повинен бути встановлений або атрибут імені, або форма


216

Я отримую цю помилку від Angular 2

core. Набір або керування формою потрібно визначати як "автономний" у ngModelOptions.

      Example 1: <input [(ngModel)]="person.firstName" name="first">
      Example 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()">

2
Козидер присудив одну з відповідей правильною
Г. Стойнев

Відповіді:


420

Якщо використовується ngForm, усі поля введення, які [(ngModel)]=""мають, мають ім'я атрибута зі значенням.

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

1
шукайте атрибут name в цьому angular.io/docs/ts/latest/api/forms/index/…
C

1
чи повинен атрибут імені мати унікальне значення?
Олександр Міллс

2
З документації Angular 5 ( angular.io/guide/forms ): "Визначення атрибуту імені є вимогою при використанні [(ngModel)] у поєднанні з формою."
елшев

2
Застосовується і для Angular 7!
coderpc

2
Я хотів би додати, що він працюватиме лише тоді, коли ngModel стане першим перед іменем.
Рональд Абеллано

55

Як у кожного розробника є звична звичка: не читати повну помилку, просто прочитайте перший рядок і починайте шукати відповідь у когось іншого :) :) Я теж один з них, ось чому я тут:

Прочитайте помилку, чітко кажучи:

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

Що ще нам потрібно, щоб зрозуміти цю помилку?

Використовуйте будь-який варіант, все буде працювати без проблем


25
Пояснення наслідків / ефектів кожної альтернативи було б корисним - вибір одного з двох довільно не здається гарною ідеєю.
Майкл

2
люблю тебе :)))))
Лола

1
Ось гарне пояснення для [ngModelOptions]="{standalone: true}: stackoverflow.com/a/38368261/3135317 . У моєму випадку я отримав страшний `ngModel використовується в тезі форми, або атрибут name must ...` Помилка, коли я мав `* ngFor * для вкладеного масиву. Обв'язка моделі була чудовою, шаблон оброблений. "Приклад 1" НЕ МОЖАЛО працювати; "Приклад 2" був ідеальним.
FoggyDay

Ця відповідь допомогла мені двічі за той же тиждень (це, мабуть, не вперше);)
Джей Каммінс,

30

Обидва атрибути потрібні, а також перевірте всі елементи форми, які мають атрибут "name". якщо ви використовуєте концепцію подання форми, інші мудрі просто використовують тег div замість елемента форми.

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

30

У моєму випадку помилка сталася через те, що внизу в розмітці html ще один рядок існував без атрибута імені .

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

Але браузер все ще повідомляє, що перший рядок має помилку. І важко виявити джерело помилки, якщо між цими двома є інші елементи. введіть тут опис зображення


16

Коли ви чітко подивитеся на консоль, вона дасть вам два приклади. Виконайте будь-який із них.

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

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


16

Я помітив, що інструмент для розробників Chrome інколи лише підкреслює перший елемент червоно-червоним кольором, навіть якщо він правильно налаштований з іменем. Це відкинуло мене на деякий час.

Потрібно обов'язково додати ім’я до кожного елемента форми, що містить ngModel, незалежно від того, який з них чітко підкреслений.


9

Виправити це досить просто.

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


3

Вам потрібно імпортувати {NgForm} з @ angular / form у свою сторінку.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);}

3

Спробуйте це...

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

3

Для всіх, хто не панікує із самим повідомленням про помилку, а просто гуглить, щоб пояснити, чому приклад звідси не працює (тобто динамічна фільтрація не відбувається, коли текст вводиться у поле введення): він не працюватиме поки ви не додасте параметр імені у поле введення. Ніщо не вказує на пояснення, чому труба не працює, але повідомлення про помилку вказує на цю тему, і виправлення її відповідно до прийнятої відповіді змушує динамічний фільтр працювати.


2

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


2

Для того, щоб мати змогу відображати інформацію в потрібній вам формі, вам потрібно вказати ці конкретні введення цікавих імен. Я рекомендую вам мати:


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

2

Для мене рішення було дуже простим. Я змінив <form>тег на a, <div>і помилка усувається.


1
Це відбувається тому, що ви видаляєте форму, тим самим видаляючи всі функції, які надає форма.
astro8891

@ astro8891 мені не потрібна функція
Джон Генкель

0
<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.

Зауважте, що слід використовувати те саме ім’я.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.