更新数组可见性中的对象

时间:2014-02-12 04:54:07

标签: javascript meteor

我的应用程序是一个双人游戏,当两个玩家进入游戏时,有一个按钮网格。游戏的目的是在所有按钮消失之前按下比对手更多的按钮。通过将按钮的可见性设置为隐藏,按钮消失。由于某种原因,这不起作用,不会向服务器或客户端抛出任何错误。这是我的方法:

Server.JS



 hideButton: function(bubble){
    console.log("method works")
    Bubbles.update({_id: this._id}, {$set: {visibility: "hidden"}}) 
  }


This is how the buttons are created

allocateGame = function(userId) {
  var gameWaiting = Games.findOne({players: {$size: 1}, current: true});

  if (!gameWaiting) {
    console.log("creating a new game, none available");
    //Added updated, required to start and finish games.
    Games.update({players: userId}, {$set: {current: false}}, {multi: true});
    var gameId = Games.insert({players: [userId], active: false, finished: false, current: true});
      _.times(64, function(n){
        Bubbles.insert({gameId: gameId});
  });

  } else {
    console.log("connecting with an existing waiting player");
    Games.update({_id: gameWaiting._id}, {$set: {active: true}, $push: {players: userId}});
  }
};

模板事件:

Client.JS


Template.grid.events({
  'click .button': function (event) { 
    var clickedElement = event.target
    console.log(clickedElement)
    Meteor.call('hideButton','clickedElement')
  }
})

该按钮只应针对两位玩家所在的当前游戏进行更新。不是所有当前游戏。我很确定我的目标是正确的,但不是隐藏按钮。我在这做错了什么? Deployed projectMy git repo

1 个答案:

答案 0 :(得分:0)

您正在使用“存根”。您的方法Meteor.call已收到hideButton。但我认为这是在客户端?如果你添加了一个服务器端,它可能是一个修复程序(如果你想要延迟组合)

这意味着它是一个“存根”。在其中运行的操作是虚拟的,不会向服务器发送任何内容。

这样的主要原因是它用于延迟补偿:如果服务器上也有hideButton,您可以使用客户端virtual使其看起来好像是即使服务器尚未收到消息,泡泡也会立即更新。

对此的修复将是使用函数。

除此之外,你还有其他一些问题(这些问题不适用于涉及普通javascript函数/方法的修复,但仅提及它们):

  • Meteor.call('hideButton','clickedElement') - 您的参数clickedElement是一个字符串,您应该在此处发送不是clickedElement或其对象的气泡ID(因为您无法使用Meteor.call发送DOM元素)
  • 您的hideButton方法使用this._id,其中this不会有_id,因为其范围适用于该方法。因此,在调用它时传递_id泡泡的原因。

由于这些,Update会尝试仅在您的浏览器会话中看到的虚拟更新,但由于this._id为空,因此不会更新任何内容。没有抛出任何错误(因为它的虚拟存根也没有在服务器上发生)