Я пытаюсь отобразить Observable в Angular. Я делаю запрос к API, чтобы получить некоторые данные, но когда я пытаюсь их отобразить, в браузере ничего не появляется.
Это сервис, который я использую для получения данных об 1 пользователе:
export class UserService {
public _url: string = "https://url/rest/user/";
constructor(private http: HttpClient) { }
getUser(id): Observable<IUser>{
return this.http.get<IUser>(this._url + id)
.catch(this.errorHandler);
}
errorHandler(error: HttpErrorResponse){
return Observable.throw(error.message);
}
}
Это пользовательский компонент:
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
providers: [ UserService ],
styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
public userId;
public errorMsg;
user: IUser;
constructor(private route: ActivatedRoute, private _userService:
UserService) { }
ngOnInit() {
let id = parseInt(this.route.snapshot.paramMap.get('id'));
this.userId = id;
this._userService.getUser(this.userId)
.subscribe(data => this.user = data,
error => this.errorMsg = error);
}
}
И представление HTML, которое я использую для отображения пользователя, выглядит следующим образом:
<div>
<h2>{{user?.firstName}} {{user?.lastName}}</h2>
<dl>
<dt>Age:</dt>
<dd>{{user?.age}}</dd>
<dt>ID:</dt>
<dd>{{user?.id}}</dd>
<dt>Email:</dt>
<dd>{{user?.email}}</dd>
</dl>
</div>
В этом примере у меня нет ошибок, но все пользовательские поля пусты, ничего не отображается. Я пытался использовать это:
<div *ngIf="user | async; let user; else loading">
<ng-template #loading>Loading User Data...</ng-template>
Но это не работает, консоль показывает:
Error: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe' ...
Я делаю тот же процесс в другом компоненте, где я использую массив пользователей, таких как IUser[], на этот раз я показываю данные с помощью ngfor, и все правильно, данные отображаются в браузере, как и ожидалось. Я делаю это так же, как я объяснил выше, но используя ngif или user?.id и без массивов.