【问题标题】:AngularFire 2 "child_added" returning all childsAngularFire 2“child_added”返回所有孩子
【发布时间】:2018-12-02 09:12:03
【问题描述】:

我很难理解来自 angularfire2 的 "child_added"

根据文档,"child_added" 应在第一次返回所有子节点,然后仅侦听添加到该特定 db 节点的新子节点。

使用我的代码,我第一次按预期得到所有孩子。问题是当我向userinfo 节点添加一个新子节点时,我仍然得到所有子节点(包括新添加的)。

这是否意味着"child_added" 每次添加新子时实际上都在下载所有子级?

我的数据库结构

.ts 代码(相关部分)

 ngOnInit(){
   this.userService.getUsers().snapshotChanges(['child_added'])
     .subscribe(users => {        
       users.forEach(user=> {
         console.log(user.key)
       })
     })
 }

服务(相关部分)

 constructor(private firebaseApp: AngularFireDatabase) {}

 getUsers(){
   return this.firebaseApp.list('userinfo/')
 }

提前谢谢你

【问题讨论】:

    标签: firebase angular6 angularfire2


    【解决方案1】:

    由于每次调用getUsers 时都会返回一个新列表,因此child_added 事件将对该列表中的每个用户触发。

    如果您只想在第一次触发所有用户,然后再进行更改,您应该只创建一次列表并从那里返回:

    var usersList;
    
    constructor(private firebaseApp: AngularFireDatabase) {}
    
    getUsers(){
      if (!this.usersList) {
        this.usersList = this.firebaseApp.list('userinfo/')
      }
      return this.usersList;
    }
    

    【讨论】:

    • 感谢您的回答。 getUsers() 实际上只在ngOnInit() 被调用一次(我相应地更新了我的问题)。我想了解的是,child_added 是否真的从数据库中重新下载了整个列表,或者只有新的孩子然后被添加到之前创建的列表中。
    • 无论您使用child_added 还是value 都无所谓,客户端将确保该位置/查询中的所有数据在客户端中可用。但是,如果您在该位置有两个侦听器,则它只会获取一次数据。因此,只要您保留列表(如我上面的代码中所示),数据将在客户端中保持可用。但是如果每次销毁现有列表(和监听器)并创建一个新列表,数据就会从内存中消失,并且每次都会重新加载。在浏览器的“网络”选项卡中可能最容易看到这一点,因为所有流量都通过网络套接字。
    • 你说得对,谢谢。因此,当usersList 已经存在时,getUsers 将简单地返回usersList,并添加新的孩子。所以userList 会一直抱着所有的孩子,对吗?
    • 正确,但无论你如何初始化它总是如此。不同之处在于,一个新列表将为每个孩子触发child_added,并且可能必须从服务器读取它(如果数据还没有出现在客户端上)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多