Angular 渲染角度为5的可观察对象

Angular 渲染角度为5的可观察对象,angular,async-await,angular-ng-if,angular-observable,Angular,Async Await,Angular Ng If,Angular Observable,我试图在角度上呈现一个可观察的。我请求API获取一些数据,但当我尝试渲染它时,浏览器上没有显示任何内容 这是我用来获取1个用户数据的服务: export class UserService { public _url: string = "https://url/rest/user/"; constructor(private http: HttpClient) { } getUser(id): Observable<IUser>{ return this.

我试图在角度上呈现一个可观察的。我请求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);
  }
}
我用来呈现de User的视图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>

我在另一个组件中也做了同样的处理,我使用了一个用户数组,如IUser[],这次我用ngfor显示数据,一切正常,数据按预期显示在浏览器中。。我用上面解释过的方法来做,但是使用ngif或user?.id,不使用数组。

至于最后一个错误,
async
管道只对可观察对象起作用。因此,与其将数据保存在用户变量中,然后将其传递给异步管道,不如尝试保存可观察对象本身:
const user$=this.\u userService.getUser(this.userId)
,然后将其传递到
async
管道:
{user$\async}

然后可以访问如下属性:
{(user$|async).age}
等等

对于您的初始错误,这可能只是请求的一个问题。您可以尝试将
数据的值注销到订阅中的控制台以进行故障排除。也许您需要
数据。响应
或其他什么。(您可以检查这一点的一种方法是使用我上面提到的可观察方法,并在模板中执行
{{user$|async | json}
,以查看对
userService.get的调用给您带来了什么

请注意,虽然您可以让手动订阅正常工作,但您需要自己处理订阅的清理工作。
async
管道是解决这类问题的方法


有关这方面的更多信息,请检查此处:

至于最后一个错误,
异步
管道仅适用于可观察对象。因此,与其将数据保存在用户变量中,然后将其传递给异步管道,不如尝试保存可观察对象本身:
const user$=this.\u userService.getUser(this.userId)
然后将其传递到
async
管道:
{{user$|async}

然后可以访问如下属性:
{(user$|async).age}
等等

对于您的初始错误,这可能只是请求的问题。您可以尝试将
数据的值注销到订阅中的控制台以进行故障排除。可能您需要
数据.response
或其他内容。(您可以通过使用我上面提到的可观察方法并执行
{{user$| async | json}
在模板中查看对
userService.get的调用得到了什么

请注意,虽然您可以让手动订阅正常工作,但您需要自己处理订阅的清理工作。
async
管道是解决这类问题的方法


有关这方面的更多信息,请点击此处:

首先,您需要将@angular/http的响应导入到您的服务中

import { Http, Headers, Response } from "@angular/http";
从rx/js获取和映射:

import { map } from 'rxjs/operators';
然后,在您的服务中,尝试以下操作:

return this.http.get(this._url + id).pipe(
  map((resp:Response) => resp.json())
)

这应该将您的响应映射到JSON。订阅observable应该按照您现在在组件中使用的方式工作。

首先,您需要将响应从@angular/http导入到您的服务中

import { Http, Headers, Response } from "@angular/http";
从rx/js获取和映射:

import { map } from 'rxjs/operators';
然后,在您的服务中,尝试以下操作:

return this.http.get(this._url + id).pipe(
  map((resp:Response) => resp.json())
)

这应该将您的响应映射到JSON。订阅observable应该按照您现在在组件中的方式工作。

API返回一个用户列表,而不是单个用户(即使您将响应指示为
IUser

您需要进行一些映射以仅获取第一个元素:

getUser(id): Observable<IUser> {

    return this.http.get<IUser>(this._url + id).map(resp => resp[0])
                    .catch(this.errorHandler);
}
getUser(id):可观察{
返回this.http.get(this.\u url+id).map(resp=>resp[0])
.catch(this.errorHandler);
}

请参阅修改后的代码:

API返回用户列表,而不是单个用户(即使您将响应指示为
IUser

您需要进行一些映射以仅获取第一个元素:

getUser(id): Observable<IUser> {

    return this.http.get<IUser>(this._url + id).map(resp => resp[0])
                    .catch(this.errorHandler);
}
getUser(id):可观察{
返回this.http.get(this.\u url+id).map(resp=>resp[0])
.catch(this.errorHandler);
}

请参阅修改后的代码:

不能使用.json(),它说“我的接口IUser的属性'json'不存在”我的不好…您可能应该在返回的映射数据(在组件中)上使用您的接口。您已经将此.user声明为IUser,因此从API调用中删除可能会起作用。我将更新我的答案…以及如何在组件中获取数据?您也可以告诉我吗?ThanksCan't use.json()它说“我的接口IUser不存在属性'json'”我的错…您可能应该在返回的映射数据上使用接口(在组件中)。您已经将此.user声明为IUser,因此从API调用中删除可能会起作用。我将更新我的答案…以及如何在组件中获取数据?您也可以告诉我吗?谢谢我已经完成了您所做的操作,但不起作用,浏览器中没有显示任何内容,就好像响应为空一样(当然不是).我已经完成了您所做的但不起作用的操作,浏览器中没有显示任何内容,好像响应是空的(当然不是空的)。如果添加console.log(数据),您会得到什么在subscribe方法中?或者更好,如果您在其中设置断点,我已经用console.log检查了数据,并且数据正确,我收到了我想要显示的内容。在subscribe方法中,数据也正确地分配给了我的用户。您可以在stackblitz上发布您的问题的最低版本吗?当然,我在这里发布s、 我想..看看下面我的答案如果你在订阅方法中添加一个console.log(数据),你会得到什么?或者更好,如果你在那里设置一个断点。嗨,我已经检查了da