我的应用程序是一个双人游戏,当两个玩家进入游戏时,有一个按钮网格。游戏的目的是在所有按钮消失之前按下比对手更多的按钮。通过将按钮的可见性设置为隐藏,按钮消失。由于某种原因,这不起作用,不会向服务器或客户端抛出任何错误。这是我的方法:
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 project和My git repo
答案 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
为空,因此不会更新任何内容。没有抛出任何错误(因为它的虚拟存根也没有在服务器上发生)