Angular and Ionic 4 to listen to live data Error: InvalidPipeArgument: '' for pipe 'AsyncPipe'

Angular and Ionic 4 to listen to live data Error: InvalidPipeArgument: '' for pipe 'AsyncPipe'

我正在尝试使用 angularfire2 和 firebase 实时数据库实时更新我的​​ ionic 4 应用程序中的消息。代码如下所示

在 运行 它抛出异常 错误:InvalidPipeArgument:'' for pipe 'AsyncPipe'

如果我删除 async 这个词,它会正常显示,但是当我 post 来自另一个实例的新消息时,整个数据会重复。

html

<ion-list lines="full" style="background:transparent">
                    <ion-item  style="padding-top:10px;" *ngFor="let msg of messages | async">
                        <ion-row  style="width:100%;">
                            <ion-col size="3">
                                <ion-row>
                                    <ion-col class="sg-reg-text">{{formatName(msg.name)}}</ion-col>
                                </ion-row>
                                <ion-row>
                                    <ion-col style="padding:0;padding-left:8px" class="sg-tiny-text"><ion-icon name="time" color="light"></ion-icon>&nbsp;now</ion-col>
                                </ion-row>
                            </ion-col>
                            <ion-col style="border-bottom: 1px solid #7e7c8d;padding-bottom: 10px">
                                <ion-row>
                                    <ion-col class="sg-reg-text">{{msg.message}}</ion-col>
                                </ion-row>
                            </ion-col>
                        </ion-row>
                    </ion-item>
              </ion-list>

ts

messages:Post[]
refresh(){
this.messages = []
this.sgSvc.getMessages().subscribe(
  (rsp:any) => {
                  for(let data of rsp){
                    console.log("hehe:" + JSON.stringify(data))
                    this.messages.push(new Post(data._name, data._message, data._uid))
                  }

                }
)
  }

ngOnInit() {
this.refresh()
}

svc.ts

private msgList: AngularFireList<Post>

getMessages(){

this.msgList = this.db.list<Post>('posts')
return this.msgList.snapshotChanges().pipe(
   map(changes => 
    changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
   )
  );
  }

尝试使用 RxJS map() 运算符构建 Post 对象数组,而不是每次在 subscribe() 中将项目推送到 messages。当您使用当前代码删除 async 管道时,您会收到重复数据,因为您没有将数组重新初始化为空数组。无论哪种方式,您都不会将 async 管道与 Array<T>:

一起使用
messages: Observable<Post[]>;

// ...

this.messages = this.sgSvc.getMessages().pipe(
  map((messages: any) => messages.map(m => new Post(m._name, m._message, m._uid)));
);

你也可以在没有 async 管道的情况下接近它:

messages: Post[] = [];

// ...

this.sgSvc.getMessages().subscribe((messages: any) => {
  this.messages = messages.map(m => new Post(m._name, m._message, m._uid));
});

希望对您有所帮助!