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> 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));
});
希望对您有所帮助!
我正在尝试使用 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> 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));
});
希望对您有所帮助!