Я работаю с угловой 7
Я хочу реализовать поле ввода автозаполнения, используя удаленную дату json из API
Я безуспешно пытаюсь использовать этот код:
book.component.html
<form [formGroup]="registerForm">
<mat-form-field class="example-full-width">
<input matInput placeholder="Choose a book" [matAutocomplete]="auto" formControlName='userInput'>
</mat-form-field>
<mat-autocomplete #auto="matAutocomplete" [displayWith]="displayFn">
<mat-option *ngIf="isLoading" class="is-loading"><mat-spinner diameter="50"></mat-spinner></mat-option>
<ng-container *ngIf="!isLoading">
<mat-option *ngFor="let book of filteredBook" [value]="book">
<span>{{ book.fullname }}</span>
<small> | ID: {{book.id}}</small>
</mat-option>
</ng-container>
</mat-autocomplete>
</form>
book.component.ts
registerForm: FormGroup;
filteredBook: Book[] = [];
isLoading = false;
ngOnInit() {
this.registerForm
.get('userInput')
.valueChanges
.pipe(
debounceTime(300),
tap(() => this.isLoading = true),
switchMap(value => this.bookService.search({fullname: value}, 1)
.pipe(
finalize(() => this.isLoading = false),
)
)
)
.subscribe(books => this.filteredBook = books);
}
displayFn(book: Book) {
if (book) { return book.fullname; }
}
book.component.service
type EntityArrayResponseType = HttpResponse<Book[]>;
search(filter: {fullname: string} = {fullname: ''}, page = 1): Observable<Book[]> {
return this.http.get<Book[]>(this.url)
.pipe(
tap((response: Book[]) => {
response
.map(book => new Book(book.id, book.fullname))
.filter(book => book.fullname.includes(filter.fullname)
)
return response;
})
);
}
, когда я пытаюсь проверить этот код, у меня появляется эта ошибка:
core.js:15437 ERROR TypeError: Cannot read property 'includes' of undefined
, несмотря на то, что у меня есть некоторые данные в отклике
Iпопробуйте также внести некоторые изменения в book.component.service
type EntityArrayResponseType = HttpResponse<Book[]>;
public temp = [];
getBokkList(): Book[] {
let book : Book;
let bookGroupObjects = new Array();
this.query({
lang: 'FR',
}).subscribe((res: HttpResponse<Book[]>) => {
this.temp = res.body;
this.temp.forEach((x) => {
book=new Book(x.id);
book.fullname=x.fullname;
bookGroupObjects.push(book);
});
});
return bookGroupObjects;
}
search(filter: {fullname: string} = {fullname: ''}, page = 1): Observable<Book[]> {
return this.http.get<Book[]>(this.url)
.pipe(
tap((response: Book[]) => {
this.getBokkList()
.map(book => new Book(book.id, book.fullname))
.filter(book => book.fullname.includes(filter.fullname)
)
return this.getBokkList();
})
);
}
, но с этим кодом отображаются все книги и фильтр не работает