使用startAt的最简单方法是只获取新的child_added来计算记录

时间:2014-01-01 20:31:04

标签: coffeescript firebase angularfire

我正在使用angularfire编写应用程序。它包括一个node.js服务(在我自己的服务器上运行),它定期对数据做“填充”。我正在尝试编写.on处理程序来更新父记录中的“计数”字段。所以我开始:

guilds = fb.child('guilds')
guilds.on 'child_added', (guildsnap) ->
  console.log 'First read of guild: ' + guildsnap.name()
  guild_applicants = fb.child('applicants').child(guildsnap.name()) 
  guild_applicants.on 'child_changed', (appsnap) ->
    console.log 'Guild Applicant Changed'
    app = new Applicant(appsnap)
    if app.val.rejected then app.reject()
    if app.val.accepted then app.accept()
  guild_applicants.on 'child_removed', (appsnap) ->
    console.log 'Applicant removed, reducing count'
    fb.child('guilds').child(guildsnap.name()).child('applicant_count').transaction (o) -> o - 1
  guild_applicants.startAt().on 'child_added', (appsnap) ->
    console.log 'Applicant added to ' + guildsnap.name() + ', increasing count'
    fb.child('guilds').child(guildsnap.name()).child('applicant_count').transaction (o) -> o + 1

因此,当服务首次加载时,它会为适当的'guild_applicants'集合创建'on'处理程序。目的是在添加或删除申请人时,处理程序将相应地更新“applicant_count”字段。

如果在创建新公会时服务正在运行,则效果很好。我可以创建一个公会,添加申请人,删除申请人,并更新applicant_count。所以,例如,我将有一个有五个申请人的公会,而applicant_count字段将= 5。

但是如果我停止服务并重新启动它,guild_applicant child_added处理程序会立即找到所有这些申请者并再次增加appliant_count字段。所以,例如。我最终会有五个申请人,appliant_count字段将= 10。

从我所看到的,您可以将“startAt”添加到firebase查询中,它将限制响应。但我不确定实现它的最佳方法。看起来我必须设置一个优先级字段,并使用它?我正在为一个用例编写自定义代码似乎很奇怪,这个用例感觉它应该足以成为库的一部分。

提前感谢任何建议!

编辑:尝试使用优先级......

以不同的方式看待同样的问题;我试图在Firebase.ServerValue.TIMESTAMP中使用优先级,并且它的工作方式与我期望的方式不同......

# on the angularfire client...
# the $set works but the $priority and $save seem to do nothing...?
      $scope.guild.$on 'loaded', (model) ->
        console.log 'guild loaded.'
        if not model
          $scope.guild.$priority = Firebase.ServerValue.TIMESTAMP
          $scope.guild.$save()
          $scope.guild.$set
            initialized: false

# on the node.js server...

# fb is an object that generates me a root firebase reference based on my fb URL
guilds = fb.child('guilds')
# i want this handler to run on every guild, new and existing, when the service starts
guilds.on 'child_added', (guildsnap) ->
  console.log 'First read of guild: ' + guildsnap.name()
  # do stuff that sets up other handlers for guild child events

# i want this handler to run only on guilds that are actually created
# to perform initialization on the guild record
guilds.startAt(Firebase.ServerValue.TIMESTAMP).on 'child_added', (guildsnap) ->
  console.log "New Guild Created"
  guild = new Guild(guildsnap)
  guild.initialize()

所以这里发生的是,'每个公会'.on开火,但'初始化'.on不会。我无法判断优先级是否实际上是由angularFire设置的??

0 个答案:

没有答案