Angular-HTTPGET在没有异步管道的情况下工作

Angular-HTTPGET在没有异步管道的情况下工作,angular,asynchronous,observable,Angular,Asynchronous,Observable,我只需要得到一个项目,所以我在模板中使用ngIf而不是ngFor 模板: <div *ngIf="item | async"> Id {{ item.id }} Number {{ item.number }} </div> 但是,如果我删除异步管道,它就会工作。我可以看到项目id和编号。 为什么?我做错了什么 PS:我使用了Angular 4.1.3异步管道期望一个承诺或可观察。在本例中,您添加了一个普通的对象。这不是管道想要的,因此它会抛出一个错误。

我只需要得到一个项目,所以我在模板中使用ngIf而不是ngFor

模板:

<div *ngIf="item | async">
    Id {{ item.id }}
    Number {{ item.number }}
</div>
但是,如果我删除异步管道,它就会工作。我可以看到项目id和编号。 为什么?我做错了什么


PS:我使用了Angular 4.1.3

异步
管道期望一个
承诺
可观察
。在本例中,您添加了一个普通的
对象
。这不是管道想要的,因此它会抛出一个错误。这里不必使用异步管道

但是,您可以这样使用它:

export class DetailItemPage {
   private item: Observable<Object>;

   ngOnInit(){
     this.getItem(6994);
   }

   getItem(id){
      this.item = this.itemProvider.get(id);
   }
} 
导出类DetailItemPage{
私人项目:可观察;
恩戈尼尼特(){
本项目(6994);
}
getItem(id){
this.item=this.itemProvider.get(id);
}
} 

在这种情况下,
实际上是一个可观察的
,您的管道会非常高兴。只需知道,使用
Observable
作为字段值的类型定义并不能保证在其中实际包含
Observable
。因为
http
调用返回一个
any
,编译器仍然相信一切都是好的,即使它实际上不是好的。

异步管道用于处理
Promise
可观察的
对象,项不是可观察的,但是当您在
subscribe
回调中分配
item
时,响应中包含的数据

如果你这样做,那就行了:

getItem(id){
  this.item=this.itemProvider.get(id);
}

那么不使用异步管道就可以了?尽管是http呼叫?事实上,这没关系
InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'
export class DetailItemPage {
   private item: Observable<Object>;

   ngOnInit(){
     this.getItem(6994);
   }

   getItem(id){
      this.item = this.itemProvider.get(id);
   }
} 
getItem(id){
  this.item=this.itemProvider.get(id);
}