将新用户添加到集合并让它们自动呈现在列表中?

时间:2013-07-28 21:38:54

标签: meteor

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

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

server.js

// newUser Method

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

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

   Players.insert(userVar);
     }
   });

client.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);
 }
 });

2 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分:1)

如果您的起点是示例的工作版本,则每次玩家收集更改时您都应该看到对网页的反应性更改。 Deps.flush或Meteor.render是不必要的。

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

要在每次登录时触发自动运行,当您有用户时,需要它来引用reactive data source。如果你像这样重写它,你会看到每次用户登录时都会出现一个新玩家:

//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);
  }
});