Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 向集合中添加新用户并使其自动呈现在列表中?_Meteor - Fatal编程技术网

Meteor 向集合中添加新用户并使其自动呈现在列表中?

Meteor 向集合中添加新用户并使其自动呈现在列表中?,meteor,Meteor,所以我在meteor网站上做排行榜的例子,但是我想创建一个新的名字和分数,当有人创建一个帐户时,它会自动出现在屏幕上,而不是我开始使用的预定义数据,因此,在这一点上,只有在我创建了一个帐户并点击浏览器上的刷新按钮后,我才能在屏幕上获得名称和分数,我想做什么,这样我就不必点击刷新按钮,用户登录名和分数就会自动出现在屏幕上 我想使用deps.flush()还是meteor.render server.js // newUser Method Meteor.methods({ newUser:

所以我在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);
 }
 });
那么我假设“玩家”记录在某种程度上属于用户?那么,当您创建一个新用户时,您是否创建了他们的新默认播放器记录

也许你只需要你的助手来检查用户的播放器记录是否存在,如果不存在,就创建它

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

如果您的出发点是示例的工作版本,那么您应该在每次播放器集合更改时看到web页面的反应性更改。不需要使用Deps.flush或Meteor.render

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

要触发自动运行每次登录,当您有一个用户时,您需要它引用一个。如果您这样重写,每次用户登录时都会看到一个新的播放器出现:

//on client
Deps.autorun( function(){
  if ( Meteor.userId() ){
    Meteor.call('newUser');
  }
});
我还想知道服务器上的方法是否会有这样的问题。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);
  }
});

您是否正在使用其中一个帐户包(例如“帐户库”)?触发用户创建以便运行onCreateUser的代码在哪里?是的,我使用帐户ui和帐户密码,我重构了这个问题,现在想知道如何在不刷新页面的情况下自动重画DOM OK感谢帮助,我做了第一个,它工作得很好,除了当我刷新页面时,它会再次创建相同的用户,所以我会在屏幕上和底部的建议中有两个用户名,它工作得很好,但是当我刷新屏幕时,我的屏幕仍然显示已登录,但没有什么好东西。是的,它会重复每次登录,所以如果您只想让每个用户登录一次,您可以在插入之前检查数据库。