我只是想知道这是否可行: 所以我正在做的是当我提交帖子时我等待它完成然后更新firebase中的用户对象以插入时间戳。
这很好并且有效,但是当插入时间戳时,它会导致订阅用户对象中的更改的其他订阅进行更新。
我想要做的是更新用户对象而不会导致其他订阅者更新。
这是我更新时间戳的地方: 我试着注释掉这行代码来阻止屏幕上的数据重复问题,但我需要运行这段代码,因为我需要在提交帖子时更新时间戳。
this.af.database.object('users/' + x[0].uid + '/lastPostAt').set(timestamp)
.then(x => { this.dialogsService.showSuccessDialog('Post Submitted'); });
以下是我订阅所有帖子的地方:
subscribeAllPosts(): Observable<Post[]> {
return this.af.database.list('/posts')
.map(Post.fromJsonList);
}
这是我在构造函数中创建帖子数组的地方,通过html中的循环显示:
this.activeItem = this.items[0];
this.postsService.subscribeAllPosts()
.subscribe(posts => {
let container = new Array<PostContainer>();
for (let post of posts) {
this.getEquippedItemsForUsername(post.username).subscribe(
x => {
try {
container.push(new PostContainer(post, x[0].equippedItems));
} catch (ex) { }
}
);
}
this.postContainers = container;
});
在内部订阅中,它为帖子的用户获取了配备的项目:
getEquippedItemsForUsername(username: string) {
return this.usersService.subscribeUserByUsername(username);
}
反过来说:
subscribeUserByUsername (username: string) {
return this.af.database.list('users' , {
query: {
orderByChild: 'username',
equalTo: username
}
});
}
在HTML中,它循环通过postContainer []:
<li *ngFor="let item of postContainers">
所有这一切都起作用所述的问题是,如果我没有以下注释,那么随着帖子的提交,帖子将会越来越重复。如果我刷新应用程序,那么帖子将显示正确的非重复帖子,直到提交另一个帖子。
this.af.database.object('users/' + x[0].uid + '/lastPostAt').set(timestamp)
.then(x => { this.dialogsService.showSuccessDialog('Post Submitted'); });
编辑:通过拆分逻辑来解决。