#angular #forms #post
Вопрос:
Я новичок в angular. Я хочу создать форму, которая принимает пользовательский ввод следующим образом. . Для этой цели я создал класс со следующими переменными
export class Hotels { name: string; email: string; address1: string; address2: string; bookingList: Contract[]; }
Контракт-это еще один класс модели со своими соответствующими атрибутами.
export class Contract { start_date: string; end_date: string; }
HTML-форма интерфейса выглядит следующим образом,
lt;form (ngSubmit) = "saveHotel()"gt; lt;input type="text" name = "name" [(ngModel)]=" hotel.name" placeholder="Enter hotel name"/gt; lt;input type="text" name = "email" [(ngModel)]=" hotel.email" placeholder="Enter hotel email"/gt; lt;input type="text" name = "address1" [(ngModel)]=" hotel.address1" placeholder="Enter hotel address line 1"/gt; lt;input type="text" name = "address2" [(ngModel)]=" hotel.address2" placeholder="Enter hotel address line 2"/gt; lt;input type="text" name = "address2" [(ngModel)]=" hotel.bookingList.start_date" placeholder="Enter hotel address line 2"/gt; lt;input type="text" name = "address2" [(ngModel)]=" hotel.bookingList.end_date" placeholder="Enter hotel address line 2"/gt; lt;button type="submit"gt;Add Hotellt;/buttongt; lt;/formgt;
Однако это не увенчалось успехом, как показано ниже, ошибка
Файл компонента
import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { Hotels } from 'src/app/models/hotels'; import { HotelsService } from 'src/app/services/hotels.service'; @Component({ selector: 'app-add-hotels', templateUrl: './add-hotels.component.html', styleUrls: ['./add-hotels.component.css'] }) export class AddHotelsComponent implements OnInit { hotel : Hotels = new Hotels(); constructor(private _hotelService : HotelsService, private _router:Router) { } ngOnInit(): void { } saveHotel(){ this._hotelService.saveHotels(this.hotel).subscribe( data =gt;{ console.log('response', data) this._router.navigateByUrl("/hotels");//to navigate back to main hotels pahge } ) } }
Файл служб
import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { Hotels } from '../models/hotels'; @Injectable({ providedIn: 'root' }) export class HotelsService { //to store http endpoint private getUrl: string = "http://localhost:8080/get/hotels"; private postUrl: string = "http://localhost:8080/savehotel"; constructor(private _httpClient:HttpClient) { } getHotels(): Observablelt;Hotels[]gt;{ return this._httpClient.getlt;Hotels[]gt;(this.getUrl).pipe( map(response =gt; response) ) } saveHotels(hotels: Hotels): Observablelt;Hotelsgt; { return this._httpClient.postlt;Hotelsgt;(this.postUrl, hotels);//no need to map as we just have to return the posted value back to component } }
Комментарии:
1. Ваш список заказов-это массив, а не объект. Поэтому вы не можете этого сделать:
hotel.bookingList.end_date
. Решения, возможно, вы можете сначала просмотретьlet booking of bookingList
свой список бронирования, и вы сможете получить доступ, например:booking.end_date
.
Ответ №1:
В классе отелей список бронирования представляет собой массив, поэтому вы не можете получить к нему доступ, как
отель.список бронирования.дата окончания
Вы должны пройти по массиву списков бронирования и получить доступ к end_date.
lt; form (ngSubmit) = "saveHotel()"gt; lt;input type="text" name = "name" [(ngModel)]=" hotel.name" placeholder="Enter hotel name"/gt; lt;input type="text" name = "email" [(ngModel)]=" hotel.email" placeholder="Enter hotel email"/gt; lt;input type="text" name = "address1" [(ngModel)]=" hotel.address1" placeholder="Enter hotel address line 1"/gt; lt;input type="text" name = "address2" [(ngModel)]=" hotel.address2" placeholder="Enter hotel address line 2"/gt; lt;span *ngFor="let booking of hotel.bookingList"gt; lt;input type="text" name = "address2" [(ngModel)]=" booking.start_date" placeholder="Enter hotel address line 2"/gt; lt;input type="text" name = "address2" [(ngModel)]=" booking.end_date" placeholder="Enter hotel address line 2"/gt; lt;/spangt; lt;button type="submit"gt;Add Hotellt;/buttongt; lt;/formgt;
Если вы хотите динамически добавлять бронирование в отель. У вас может быть отдельная кнопка для добавления бронирования в массив hotel.bookingList.
lt;button type="submit" (click)="addHotelBooking()"gt;Resetlt;/buttongt; addHotelBooking = () =gt; { this.hotel.bookingList.push({ start_date: null, end_date: null }) }
Комментарии:
1. можете ли вы привести мне пример того, как это сделать, пожалуйста
2. я отредактировал ответ. это будет одним из способов обработки массива данных объектов.
3. Большое спасибо за ответ. Но я столкнулся с небольшой проблемой, когда поля ввода с диапазоном не отображаются в пользовательском интерфейсе. Знаете ли вы причину этого?
4. У вас должно быть по крайней мере одно бронирование в массиве списков бронирования отелей.
5. нет, как и поле ввода , которое находится внутри lt;spangt;тега, само по себе не отображается в форме