AngularFire2 Firebase更新对象,不会导致其他订阅更新

时间:2016-12-12 16:47:51

标签: javascript angular firebase firebase-realtime-database angularfire2

我只是想知道这是否可行: 所以我正在做的是当我提交帖子时我等待它完成然后更新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');  });

编辑:通过拆分逻辑来解决。

0 个答案:

没有答案