#angular
#angular
Вопрос:
http-клиент get array имеет значение, но значение в компоненте не определено в Angular 9
мое значение не определено
это мой сервис
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class RequestService {
constructor(private http: HttpClient) { }
private address = 'http://localhost:8080/request';
public getAll<T>(): Observable<T> {
return this.http.get<T>(this.address);
}
}
это мой файл components.ts
import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { RequestService } from './request.service';
@Component({
selector: 'app-table-request',
templateUrl: './table-request.component.html',
styleUrls: ['./table-request.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TableRequestComponent implements OnInit {
dataList!: [];
constructor(private rs: RequestService) {
this.loadData();
console.log(this.dataList)//this is console.log
}
ngOnInit(): void {
}
loadData() {
this.rs.getAll().subscribe((res: any) => {
this.dataList = res;
});
}
}
это результат из console.log
https://i.stack.imgur.com/51YPh.png
Комментарии:
1. Вместо вызова метода loadData() в конструкторе попробуйте вызвать его в oninit().
2.
dataList
Переменная назначается асинхронно, и вы не можете получить к ней доступ синхронно. Любые инструкции, которые напрямую зависят от него, должны быть внутри подписки. Другими словами, подпишитесь наgetAll()
observable, где требуется его ответ.
Ответ №1:
Вы вызываете console.log
перед возвратом вызова API, попробуйте изменить его на:
loadData() {
this.rs.getAll().subscribe((res: any) => {
this.dataList = res;
console.log(this.dataList);
});
}
Комментарии:
1. Это работает. Но значение в dataList все еще не определено. Я не знаю, как это исправить
2. Что такое datalist! Разве это не должен быть список данных?
Ответ №2:
Попробуйте это:
export class TableRequestComponent implements OnInit {
dataList: [];
constructor(private rs: RequestService) {
}
ngOnInit(): void {
this.loadData();
}
loadData() {
this.rs.getAll().subscribe((res: any) => {
this.dataList = res;
console.log(this.dataList)//this is console.log
});
}
}
И привяжите свой «dataList» к вашему дисплею (например, к таблице). Вы можете прочитать больше об асинхронном вызове, чтобы узнать, почему вы не можете получить значение «datatList» за пределами «subscribe».