#javascript #angular #typescript #frontend
#javascript #angular #typescript #интерфейс
Вопрос:
У меня нет ошибки в моей консоли, но я не могу отобразить ее в таблице данных материала. Некоторое время заглядываю в код, но не могу в нем разобраться. Единственное, что приходит мне в голову, это то, что API неверен. xxxxx представляет некоторый URL API. Равномерно мне не разрешено показывать реальную ссылку.
restaurant.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Restaurant } from '../models/restaurant.model';
@Injectable({
providedIn: 'root'
})
export class RestaurantService {
private restaurantsUrl = 'https://xxxxxx/getAllServices.php';
constructor(private http: HttpClient) { }
getRestaurants(): Observable<Restaurant[]> {
return this.http.get<Restaurant[]>(this.restaurantsUrl);
}
}
ресторан-table.component.ts
import { Component, ViewChild,OnInit } from '@angular/core';
import { RestaurantService } from '../services/restaurant.service';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import {DataSource} from '@angular/cdk/collections';
import { Restaurant } from '../models/restaurant.model';
@Component({
selector: 'app-restaurants-table',
templateUrl: './restaurants-table.component.html',
styleUrls: ['./restaurants-table.component.css']
})
export class RestaurantsTableComponent implements OnInit {
dataSource = new RestaurantDataSource(this.restaurantService);
displayedColumns = ['id', 'ime_restorana', 'opis', 'broj_telefona', 'adresa_restorana','edits'];
constructor(private restaurantService: RestaurantService) {
}
ngOnInit() {
}
}
export class RestaurantDataSource extends DataSource<any> {
constructor(private restaurantService: RestaurantService) {
super();
}
connect(): Observable<Restaurant[]> {
return this.restaurantService.getRestaurants();
}
disconnect() {}
}
restaurant-table.component.html
<div class="">
<mat-table [dataSource]="dataSource">
<ng-container matColumnDef="id">
<mat-header-cell *matHeaderCellDef> ID </mat-header-cell>
<mat-cell *matCellDef="let restaurant"> {{ restaurant.id }} </mat-cell>
</ng-container>
<ng-container matColumnDef="ime_restorana">
<mat-header-cell *matHeaderCellDef> Naziv </mat-header-cell>
<mat-cell *matCellDef="let restaurant"> {{ restaurant.ime_restorana }} </mat-cell>
</ng-container>
<ng-container matColumnDef="opis">
<mat-header-cell *matHeaderCellDef> Opis </mat-header-cell>
<mat-cell *matCellDef="let restaurant"> {{ restaurant.opis }} </mat-cell>
</ng-container>
<ng-container matColumnDef="broj_telefona">
<mat-header-cell *matHeaderCellDef> Broj Telefona </mat-header-cell>
<mat-cell *matCellDef="let restaurant"> {{ restaurant.broj_telefona }} </mat-cell>
</ng-container>
<ng-container matColumnDef="adresa_restorana">
<mat-header-cell *matHeaderCellDef> Adresa </mat-header-cell>
<mat-cell *matCellDef="let restaurant"> {{ restaurant.adresa_restorana }} </mat-cell>
</ng-container>
<ng-container matColumnDef="edits">
<th mat-header-cell *matHeaderCellDef></th>
<td mat-cell *matCellDef="let element">
<button mat-raised-button class="edit-btn"><mat-icon>edit</mat-icon></button>
<button mat-raised-button class="edit-btn"><mat-icon>remove_red_eye</mat-icon></button>
</td>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>
</div>
И user.model.ts
export interface User {
name: string;
email: string;
phone: string;
company: {
name: string;
}
}
Комментарии:
1.
getRestaurants()
возвращает наблюдаемое. Так что попробуйтеthis.http.get<Restaurant[]>(this.restaurantsUrl).subscribe(res => console.log(res))
и посмотрите на результат.2. @DaniR Я добавил
this.http.get(this.restaurantsUrl).subscribe(res => console.log(res))
, как вы предложили, и для вывода я получаю объект, внутри которого находится массив, который я ищу. когда я набираю...console.log(res.restorani)
, я получаю то, что мне нужно. Спасибо. Теперь, я действительно новичок в Angular, поэтому я был бы признателен, если бы вы могли сказать мне, как получить этот массив в DataSource в component.ts и отобразить его в component.html
Ответ №1:
Ваш текущий dataSource
является экземпляром RestaurantDataSource
класса, то, что вы хотите (я полагаю), является фактическим списком ресторанов, следовательно
dataSource = new RestaurantDataSource(this.restaurantService).connect();
Однако ваш connect()
метод возвращает наблюдаемое, а не сам список, поэтому вам нужно использовать async
канал в вашем шаблоне
<mat-table [dataSource]="dataSource | async">