我刚刚在阅读了“探索流星”一书后开始使用Meteor,并且一直在敲打一个非常讨厌的问题。我想我缺少一些基础知识,因为我似乎无法弄明白。
目标很简单。用户在创建帐户时获得一个球,并且只能移动他自己的球。没有什么花哨。 问题在于:在用户创建/首次登录时,用户可以看到他的球并且应用程序突出显示它。但是当使用箭头键时,只有其他浏览器/会话可以看到球移动。如果新创建的用户刷新,则球会在所有浏览器/会话上移动。
相关的代码:
Deps.autorun(function() {
if (!Meteor.user()) {
//user logged out
Session.set('session_ball', null);
} else {
//user logged in
var user = Meteor.user(),
ballId = false;
//check if the user has a ball yet
if (!user.profile.hasBall) {
var ball = {},
x = parseInt(Math.random() * (500 - 200) + 200, 10),
y = parseInt(Math.random() * (500 - 200) + 200, 10),
name = 'ball_' + x + '_' + y;
ball.name = name;
ball.x = x;
ball.y = y;
ball.owner = user._id;
Meteor.call('addBall', ball, function (error, id) {
if (error) {
console.log('error with adding ball');
} else {
//update the user's hasball property
Meteor.users.update(user._id, {$set: {"profile.hasBall": true}});
console.log('made new user ball');
}
});
}
}
});
和方法:
Meteor.methods({
addBall: function(ball) {
var user = Meteor.user();
// ensure the user is logged in
if (!user || !ball) {
throw new Meteor.Error(401, 'Oh Balls');
}
var ballId = Balls.insert(ball);
return ballId;
},
moveBall: function(options) {
if (!options) {
throw new Meteor.Error(401, 'Oh Balls');
}
if (Balls.findOne({_id: options.ballId, owner: Meteor.userId()})) {
Balls.update(options.ballId, {$inc: {x: options.x, y: options.y}});
}
return options.ballId;
}
});
由于流星项目中的代码分散在一堆不同的文件中,因此可能更容易在GitHub上看到该项目。