Угловой: Ошибка, полученная во время захвата поля

#angular #typescript #forms

Вопрос:

У меня есть следующая форма:

 <form class="form-margin cart-container" #form="ngForm" (ngSubmit)="submitForm()">
    <div style="flex-direction: column">
        <app-cart-item class="cart-item" *ngFor="let pr of productRecordList" [productRecord]="pr"></app-cart-item>
        <br />
        <p style="font-family: Verdana, Geneva, Tahoma, sans-serif; font-weight: bolder">Total ${{ getTotal() }}</p>
    </div>

    <div class="cart-item-details">
        <!-- <input type="text" cols="35" rows="2" placeholder="(minimum 3 characters)" required minlength="3" [(ngModel)]="fullName" #ffullName="ngModel"/> -->

        <p>Full Name</p>
        <input type="text" cols="35" rows="2" placeholder="(minimum 3 characters)" required minlength="3" />
        <br />
        <p>Address</p>
        <input type="text" cols="35" rows="2" placeholder="(minimum 6 characters)" required minlength="6" />
        <br />
        <p>Credit card number</p>
        <input type="text" cols="35" rows="2" placeholder="(16-digits number)" required minlength="16" maxlength="16" />
        <br />

        <p>We will never share your payment details to anyone</p>
        <input type="submit" class="btn btn-primary" name="Submit" routerLink="/confirmation" />
    </div>
</form>
 

Класс TypeScript предоставляется:

 import { ProductsService } from './../../services/products.service';
import { Component, OnInit } from '@angular/core';
import ProductRecord from 'src/app/services/products.service';

@Component({
    selector: 'app-cart',
    templateUrl: './cart.component.html',
    styleUrls: ['./cart.component.css']
})
export class CartComponent implements OnInit {
    productRecordList: ProductRecord[] = [];

    fullName: string = '';
    address: string = '';
    cardNumber: number = 0;

    totalPrice: number = 0.0;

    constructor(private productsService: ProductsService) {}

    ngOnInit(): void {
        this.productRecordList = this.productsService.getProductsFromCart();
    }

    getTotal(): number {
        this.totalPrice = this.productsService.getProductsPriceTotal();

        return this.totalPrice;
    }

    submitForm(): void {

      // console.log(this.fullName);
      // console.log(this.totalPrice);
    }
}
 

Я хотел бы зафиксировать fullName значение при отправке формы, поэтому я изменил <input> тег, как показано ниже:

 <input type="text" cols="35" rows="2" placeholder="(minimum 3 characters)" required minlength="3" [(ngModel)]="fullName"/>
 

Это делается для того, чтобы я мог зафиксировать значение в fullName поле в соответствующем классе. Однако это нарушает кодекс.

Я получаю сообщение об ошибке:

 ERROR Error: 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.
 

Как я могу захватить поле при отправке?

Комментарии:

1. Вы импортировали модуль FormsModule и модуль ReactiveFormsModule в модуль своей страницы?

2. Да, другие формы работают. Я думаю, проблема в том, что я пытаюсь использовать [(ngModel)]="fullName" внутри <div>

Ответ №1:

Попробуйте это:

<тип ввода=»текст» cols=»35″ строк=»2″ заполнитель=»(минимум 3 символа)» требуемая минимальная длина=»3″ [(ngModel)]=»Полное имя» имя=»Полное имя»/>

Комментарии:

1. Вот как я исправил это после прочтения другого ответа. Хотя это очень полезно.

2. Так ты! Я рад, если это помогло!

Ответ №2:

Когда вы используете @angular/формы, Angular превращает вашу форму в группу форм. Когда вы добавляете [ngModel] на свой ввод, Angular создаст элемент управления формой внутри вашей группы форм с заданным атрибутом name. Когда вы решаете использовать [ngModelOptions]=»{автономный: true}», этого не происходит.

Таким образом, вы можете решить свою проблему, добавив [ngModelOptions]="{standalone: true}" свои данные.

Извините за мой плохой английский, надеюсь, я ясно выразился.

Комментарии:

1. Нужно ли мне указывать это [ngModelOptions]="{standalone: true}" в <input> теге?

2. <тип ввода=»текст» cols=»35″ строк=»2″ заполнитель=»(минимум 3 символа)» требуемая минимальная длина=»3″ [(ngModel)]=»Полное имя» [ngModelOptions]=»{автономный: true}»>

3. Спасибо, хотя я решаю эту проблему, как указано в другом ответе.