0

所以我在流星网站上做排行榜示例,但不是我开始使用的预定义数据,我想创建一个新名称和分数,当有人创建帐户时它会自动出现在屏幕上,所以此时我得到了名称只有在我创建帐户并点击浏览器上的刷新按钮后屏幕上的分数,我想要做什么才能不必点击刷新按钮并且用户登录名和分数会自动出现在屏幕?

我想以某种方式使用 deps.flush() 或 meteor.render 吗?

服务器.js

// newUser Method

 Meteor.methods({
  newUser: function() {
   var user = Meteor.user();

    userVar = {
     name: user.username,
    score: 0
     };

   Players.insert(userVar);
     }
   });

客户端.js

Deps.autorun(function() {
  Meteor.call('newUser');
  });

 Template.leaderboard.players = function () {
   return Players.find({}, {sort: {score: -1, name: 1}});
  };

  Template.leaderboard.selected_name = function () {
    var player = Players.findOne(Session.get("selected_player"));
     return player && player.name;
   };

   Template.player.selected = function () {
      return Session.equals("selected_player", this._id) ? "selected" : '';
     };

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

Template.player.events({
 'click': function () {
  Session.set("selected_player", this._id);
 }
 });
4

2 回答 2

1

所以我假设“玩家”记录以某种方式属于用户?所以当你创建一个新用户时,你创建了他们新的默认玩家记录?

也许您只需要您的助手检查用户的玩家记录是否存在,如果不存在,则创建它。

Template.leaderboard.players = function () {
  var players = Players.find({/* Get players for this user */ }, {sort: {score: -1, name: 1}});
  if(!players) {
    players = /* Insert default player record */
  }
  return players;
};
于 2013-07-29T00:36:02.837 回答
1

如果您的出发点是示例的工作版本,那么您应该会在每次 Players 集合更改时看到网页的反应性更改。Deps.flush 或 Meteor.render 是不必要的。

您拥有的 Deps.autorun() 函数仅在客户端启动时调用一次。此时您可能没有用户,当您尝试从空变量“user”获取用户名时,您的方法将失败。

要触发每次登录时的自动运行,当您有用户时,您需要它来引用反应式数据源。如果您像这样重写它,您应该会在每次用户登录时看到一个新玩家出现:

//on client
Deps.autorun( function(){
  if ( Meteor.userId() ){
    Meteor.call('newUser');
  }
});

我还想知道您在服务器上的方法是否会出现问题,因为 this.userId 是我通常在方法中获取用户信息的方式。这是避免该方法的替代方法,只需将播放器插入客户端:

//on client
Deps.autorun( function(){
  var user = Meteor.user();

  if ( user ) {   //insert will run on login or any change in the user
    var userVar = {
      name: user.username,
      score: 0
    };

    Players.insert(userVar);
  }
});
于 2013-07-29T00:56:02.827 回答