Возвращаемое API значение JSON имеет следующую форму
{
"Search": [
{"Title":"Hello, My Name Is Doris","Year":"2015","imdbID":"tt3766394","Type":"movie","Poster":"https://m.media-amazon.com/images/M/MV5BMTg0NTM3MTI1MF5BMl5BanBnXkFtZTgwMTAzNTAzNzE@._V1_SX300.jpg"},
// etc.
]
}
Поэтому вам необходимо внести некоторые корректировки.
Во-первых, вам необходимо спроецировать ответ, извлекая Search
свойство, которое содержит массив фильмов. Это должно быть сделано в вашем сервисе (обратите внимание на улучшенное использование типов)
api-Call.Service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import Film from './models/film.model';
@Injectable()
export class ApiService {
constructor(private http:HttpClient){}
getFilms(searchTerm): Observable<Film[]> {
const apiUrl = 'http://www.omdbapi.com/?apikey=b1464edd&s=';
const fullLink = apiUrl + searchTerm;
type Response = { Search: Film[] };
return this.http.get<Response> (fullLink)
.pipe(map(response => response.Search));
}
}
Затем мы должны объявить свойство имена в интерфейсе модели для правильного описания формы пленки в ответе
film.model.ts
export default interface Film {
Title: string;
Year: string;
imdbID: string;
Poster: string;
Type: string;
}
Теперь давайте настроим сам компонент для улучшения типы немного
app.component.ts
import { Component } from '@angular/core';
import { ApiService } from './services/api-calls.service';
import { MatTableDataSource } from '@angular/material';
import Film from './models/film.model';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private apiService:ApiService) {}
displayedColumns: (keyof Film)[] = ['Title', 'Year', 'imdbID', 'Poster', 'Type'];
dataSource?: MatTableDataSource<Film[]>;
searchTerm = '';
handleSearch({ action, query }) {
if (action === 'SEARCH' && query) {
this.searchTerm = query;
this.apiService.getFilms(this.searchTerm)
.subscribe(films => this.dataSource = new MatTableDataSource(films));
}
}
}
Обратите внимание, как улучшено использование типов, чтобы ограничить имена столбцов, чтобы они оставались в синхронизации c между компонентом и службой. Также обратите внимание, что избыточная информация о типах была улучшена, чтобы использовать в своих интересах вывод типа, вытекающий из улучшенной сигнатуры типа метода службы.