【问题标题】:Change Which Element Increment JavaScript更改哪个元素递增 JavaScript
【发布时间】:2014-07-27 05:09:41
【问题描述】:

在 JavaScript 中创建一个立即更新到 MongoDB 的排行榜。为了增加某人在排行榜上的点数,您点击相应的<div>,他们的得分就会增加 5 个“点”。

这是通过使用这个函数来完成的

Template.leaderboard.events({
'click div.inc': function () {
  Players.update(Session.get("selected_player"), {$inc: {score: 5}});
}
});

我希望用户只更新一个播放器,但允许更改。所以举个例子,如果用户选择“John Smith”,“John Smith”应该只能增加5分。除此之外,如果用户决定将积分分配给“Janie Smith”,“John Smith”应该会失去 5 分,而“Janie Smith”应该会获得积分。

最好的方法是什么?我可以通过找出之前的“selected_div”来做到这一点吗?

【问题讨论】:

  • 同一个玩家点击两次会怎样?
  • @DavidWeldon 它应该只增加 5 分一次。之后,如果您两次单击同一播放器,则不会发生任何事情。

标签: javascript meteor


【解决方案1】:

用这个替换Template.leaderboard.events

Template.player.events({
  click: function() {
    // only continue if this was not the last player clicked
    if (!this.isLast) {

      // find the last player clicked
      var lastPlayerClicked = Players.findOne({isLast: true});

      // remove the isLast marker from the previously clicked player and
      // decrement her score
      if (lastPlayerClicked) {
        var modifier = {$inc: {score: -5}, $unset: {isLast: ''}}
        Players.update(lastPlayerClicked._id, modifier);
      }

      // update this player with a new score and mark her as last
      Players.update(this._id, {$inc: {score: 5}, $set: {isLast: true}});
    }
  }
});

它通过设置或删除isLast 来跟踪最后点击的玩家,然后根据需要修改当前和最后一个玩家。在添加之前,您可能希望通过运行 meteor reset 来确保您拥有一个干净的数据库。

【讨论】:

  • 回过头来看,我注意到(曾经)只有一票。我希望每个不同的IP都有机会给分。我该怎么做?
  • 通过this question中看到的方法调用将逻辑移动到服务器。
  • 您是否有机会将两者结合使用来更新此答案?我很困惑,因为那是有时间限制的——我不想要这些。
  • 我建议您问另一个问题,具体说明您想要什么并参考这两个答案。
【解决方案2】:

我认为您需要将最近的玩家添加到数据库中:

Template.leaderboard.events({
    'click input.div': function () {
      var player = Session.get("selected_player");
      var currentPlayer = Players.find(player);
      var recentlyChanged = Players.find({changed: true});

      if(recentlyChanged === currentPlayer) {
          Players.update(player,  {$inc: {score: 5}});

      } else {
          Meteor.call('newScore', recentlyChanged, player);

      }
    }
  });

if (Meteor.isServer) {

 Meteor.methods({
        newScore: function(recentlyChanged, player) {
            if(recentlyChanged) {
                Players.update(recentlyChanged, {$inc: {score: -5}});
            }
            Players.update({}, {changed: false}, {multi: true});
            Players.update(player, {changed: true}, {$inc: {score: 5}});
        }
    });

}

【讨论】:

  • 这有一个错误,因为我不确定) 应该在player } 之后出现,但我删除了它并且它不起作用。
  • 我认为最近的玩家需要添加到数据库中
猜你喜欢
  • 2014-11-22
  • 2018-10-21
  • 2016-03-29
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2022-10-24
  • 2014-09-29
  • 2012-07-07
相关资源
最近更新 更多