Я новичок в angular и пытаюсь фильтровать данные. Я создал веб-страницу со списком отелей, но хотел бы отфильтровать их по их звездному рейтингу. Я не знаю, как даже попытаться это сделать. Любая помощь будет принята с благодарностью!
отели.component.ts :
import { Component } from '@angular/core';
import { WebService } from './web.service';
@Component({
selector: 'hotels',
templateUrl: './hotels.component.html',
styleUrls: ['./hotels.component.css']
})
export class HotelsComponent {
hotel_list: any;
page: number = 1;
constructor(public webService: WebService) { }
ngOnInit() {
if (sessionStorage['page']) {
this.page = Number(sessionStorage['page'])
}
this.hotel_list = this.webService.getHotels(this.page);
}
Веб-сервисы.ts:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
@Injectable()
export class WebService {
private hotelID: any;
constructor(private http: HttpClient) { }
getHotels(page: number) {
return this.http.get('http://localhost:5000/api/v1.0/hotels?pn=' + page);
}
отели.components.html:
<div class = "container">
<div class = "row">
<div class = "col-sm-12">
<div *ngFor = "let hotel of hotel_list | async">
<div class = "card text-white bg-primary mb-3"
style = "cursor : pointer"
[routerLink] = "['/hotels', hotel._id]">
<div class = "card-header">
{{ hotel.hotel }}
</div>
<div class = "card-body">
This hotel is based in
{{ hotel.city }}
</div>
<div class = "card-footer">
{{ hotel.rating }}
stars
</div>
</div>
</div>
Предположим, что вам нужно отфильтровать хостелы на стороне клиента после получения отелей. То есть возвращались только отели для page = 1.
в hotels.component.ts :
filtered_hotels_list: any = []; //empty array
//......
ngOnInit() {
if (sessionStorage['page']) {
this.page = Number(sessionStorage['page'])
}
this.webService.getHotels(this.page).subscribe(data => {
this.hotel_list = data
this.filter();
});
}
filter(rating:number = -1) { // rating = -1 shows all
if (rating > -1) {
this.filtered_hotels_list = this.hotel_list.filter((o:any) => o.rating == rating)
} else this.filtered_hotels_list = this.hotel_list
}
в hotels.components.html:
<div *ngFor = "let hotel of filtered_hotel_list">
И реализуйте свой пользовательский интерфейс, чтобы добавить кнопку фильтра, которая вызывает функцию filter(5).
Спасибо, что вернулись! Я получаю сообщение об ошибке (o => o.rating == rating), говоря: «параметр o неявно имеет любой тип». Любая идея, как решить эту проблему?
если у вас есть класс Hotel
, используйте o: Hotel
. В противном случае o: any
должен это сделать.
this.filtered_hotels_list = this.hotel_list.filter((o: any) => o.rating == рейтинг)
Как бы я реализовал это в своем пользовательском интерфейсе? Вот что у меня есть на данный момент: <div class = "dropdown"> <div *ngFor = "let hotel of filtered_hotels_list"></div> <button type = "button" class = "btn btn-primary dropdown-toggle" data-toggle = "dropdown"> Dropdown button </button> <div class = "dropdown-menu"> <a class = "dropdown-item" href = "#">5 Star</a> <a class = "dropdown-item" href = "#">4 Star</a> <a class = "dropdown-item" href = "#">3 Star</a> <a class = "dropdown-item" href = "#">2 Star</a> <a class = "dropdown-item" href = "#">1 Star</a> </div> </div>
Должны ли эти критерии фильтрации применяться на уровне пользовательского интерфейса или на уровне API? Поддерживает ли API запрос отелей по их рейтингу?