我有一个示例代码:
客户助手:
getUsername: function (userId) {
Meteor.call("getUsername", userId, function (err, result) {
if(!err) {
Session.set("setUsername", result);
else {
console.log(err);
}
});
return Session.get("setUsername");
}
服务器
Meteor.methods({
"getUsername": function (userId) {
var x = Meteor.users.find({_id: userId}, {fields: {username:1}}).fetch()[0];
return x.username;
}
});
此代码的结果是传递给客户端的用户名无限循环。有没有办法停止循环并只传递客户端所需的数据?我相信反应性导致数据无限循环,我不知道如何阻止它。我尝试在服务器中使用"reactive":false
查询但不起作用。
答案 0 :(得分:0)
如果你想在客户端模板中的任何地方访问用户名(这就是为什么你把它放入会话中),我不会在模板帮助器中设置它。我会在启动时设置它并从模板助手中的会话中获取用户名(不调用服务器方法)
如果您只需要在一个模板中使用用户名,那么您希望从模板帮助程序返回其值,请不要将其放入会话中,只需在服务器方法回调中返回它。
答案 1 :(得分:0)
根据您的示例代码,我假设您有一组帖子,并且您正在根据每个帖子的用户ID检索用户名。然后,您应该使用publish composite包来发布相关用户,而不是这样做。
Meteor.publishComposite('getPosts', function (postIds) {
return [{
find: function() {
return Posts.find({ _id: { $in: postIds }});
// you can also do -> return Posts.find();
// or -> return Posts.find({ /* or what ever your selector is to get the posts you need*/ });
},
children: [{
find: function(post) {
return Meteor.users.find({
id: post.userId //or the correct field in your post document to get user id
}, {
fields: {
"profile": 1
}
});
}
}}
}]
});
通过这种方式,您的出版物将负责发布相关用户以及帖子。您不需要每次都使用方法并调用它们。