У меня есть запрос на получение с Httpclient. У меня проблема, когда я пытаюсь получить доступ к этой переменной, загруженной по этому запросу из другого компонента. Когда я пытаюсь это сделать, я нахожу его пустым.
Это метод в службе:
import { HttpClient } from '@angular/common/http';
...
getBooks(page: string) {
let url = `${this.urlAPI}books?page=${page}`;
return this.http.get<Book[]>(url).pipe(map((res: Book[]) => res));
}
Это код в component.ts. Это рекурсивно, потому что API загружает только 50 каждый раз.
import { ApiService } from 'src/app/services/api.service';
...
books: Book[] = [];
...
constructor(public auth: AuthService, public _api: ApiService, private router: Router) {
this.loadBooks(1);
}
...
loadBooks(page: number) {
this._api.getBooks(page.toString()).subscribe((resp: Book[]) => {
this.books = this.books.concat(resp);
if (resp.length !== 0)
this.loadBooks(page + 1)
else{
...
}
});
}
И это способ загрузки переменной из дочернего компонента enet:
import { Component, OnInit, Input } from '@angular/core';
import { BooksComponent } from '../../tab/books/books.component';
...
import { ApiService } from 'src/app/services/api.service';
@Component({
selector: 'app-book',
templateUrl: './book.component.html',
styleUrls: ['./book.component.scss'],
providers: [BooksComponent]
})
export class BookComponent implements OnInit {
book: Book = new Book();
constructor(private bc:BooksComponent, public _api: ApiService, private route: ActivatedRoute) {
console.log(bc.books);
...
}
Вызов дочерний компонент это сделано после родителя. Также я знаю, что это асинхронный вызов, поэтому пока он не завершится sh, переменная не заполнена. Но я называю это после просмотра всех данных в родительском компоненте. Я не понимаю, почему, если у меня есть переменная заполнена, этот массив пуст от другого компонента. Спасибо за ваши ответы.
ОБНОВЛЕНИЕ: Это HTML Я использую для вызова компонента книги:
<ng-container matColumnDef="detail">
<th mat-header-cell *matHeaderCellDef> Details </th>
<td mat-cell *matCellDef="let row">
<button mat-button (click)="detail(row.url)">
<mat-icon>info</mat-icon>
</button>
</td>
</ng-container>
Это часть таблицы angular материал. Я использую функцию go, чтобы забронировать компонент.
Это NgModule:
@NgModule({
declarations: [
AppComponent,
HomeComponent,
ListComponent,
NavbarComponent,
ProfileComponent,
BooksComponent,
BookComponent
],
imports: [
BrowserModule,
AppRoutingModule,
APP_ROUTING,
MaterialModule,
HttpClientModule
],
providers: [ApiService],
bootstrap: [AppComponent]
})
export class AppModule { }
Родительский компонент - второй код. Остальная часть кода относится к MatPaginator, MatSort или MatTableDataSource.
ОБНОВЛЕНИЕ 2:
Я оставляю код в GitHub: WikiIceAndFire