Coffeescript 使用startAt只为计数记录添加新的child_的最简单方法

Coffeescript 使用startAt只为计数记录添加新的child_的最简单方法,coffeescript,firebase,angularfire,Coffeescript,Firebase,Angularfire,我正在用angularfire编写一个应用程序。它包括一个node.js服务(在我自己的服务器上运行),该服务定期对数据进行“填充”。我正在尝试在处理程序上写入.以更新父记录中的“计数”字段。所以我从以下几点开始: guilds = fb.child('guilds') guilds.on 'child_added', (guildsnap) -> console.log 'First read of guild: ' + guildsnap.name() guild_applic

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

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
因此,当服务首次加载时,它会为相应的“公会申请人”集合创建“开启”处理程序。目的是在添加或删除申请人时,处理程序将相应地更新“申请人计数”字段

如果在创建新公会时该服务正在运行,那么它将非常有效。我可以创建公会,添加申请者,删除申请者,并更新申请者数量。例如,我将有一个有五个申请者的公会,申请者计数字段将=5

但是如果我停止服务并重新启动它,guild_Appendent 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()

因此,这里发生的是“每个公会”。会开火,但“初始化”。不会。我不知道优先级是否真的是由angularFire设定的…?

很不清楚这里的计数应该代表什么。它看起来应该代表申请人/$guild_name中的所有申请人(字面上是那里的记录数),但您的问题似乎只要求添加/删除自您开始观察以来的儿童。我们试图在这里创建的基本用例是什么?是的,我试图统计申请者的数量。问题是每当my node.js重新启动时,每个记录上都会触发添加的子事件。因此,每次重新启动时,它都会增加计数,导致第一次重新启动时5条实际记录的计数=10,第二次重新启动时5条实际记录的计数=15,等等。我对公会本身有一个类似的用例(第二个示例)。我希望node.js服务初始化一些值,但只有在第一次添加公会时才初始化。同样的问题:每次我重新启动节点服务时,添加的child_处理程序都会被触发,这将导致现有的公会重新初始化。听起来,您希望只在公会对象第一次创建时对其进行初始化。为什么不简单地运行node.js服务器,并对每个添加的子调用进行初始化呢?您可以设置一个sentinel标志,如“initialized:true”,以检查如果脚本需要重新启动,服务器仍需要处理哪些记录;我这样做是为了“公会”对象,但感觉应该有更好的方法。看起来有很多额外的工作要做。我觉得应该有一种方法可以让我开始订阅新的孩子。