Meteor 向集合中添加新用户并使其自动呈现在列表中?
所以我在meteor网站上做排行榜的例子,但是我想创建一个新的名字和分数,当有人创建一个帐户时,它会自动出现在屏幕上,而不是我开始使用的预定义数据,因此,在这一点上,只有在我创建了一个帐户并点击浏览器上的刷新按钮后,我才能在屏幕上获得名称和分数,我想做什么,这样我就不必点击刷新按钮,用户登录名和分数就会自动出现在屏幕上 我想使用deps.flush()还是meteor.render server.jsMeteor 向集合中添加新用户并使其自动呈现在列表中?,meteor,Meteor,所以我在meteor网站上做排行榜的例子,但是我想创建一个新的名字和分数,当有人创建一个帐户时,它会自动出现在屏幕上,而不是我开始使用的预定义数据,因此,在这一点上,只有在我创建了一个帐户并点击浏览器上的刷新按钮后,我才能在屏幕上获得名称和分数,我想做什么,这样我就不必点击刷新按钮,用户登录名和分数就会自动出现在屏幕上 我想使用deps.flush()还是meteor.render server.js // newUser Method Meteor.methods({ newUser:
// 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感谢帮助,我做了第一个,它工作得很好,除了当我刷新页面时,它会再次创建相同的用户,所以我会在屏幕上和底部的建议中有两个用户名,它工作得很好,但是当我刷新屏幕时,我的屏幕仍然显示已登录,但没有什么好东西。是的,它会重复每次登录,所以如果您只想让每个用户登录一次,您可以在插入之前检查数据库。