向上和向下投票是有效的,但我想做一个像#34;如果用户是downvoter或upvoter"并做正确的事情,如下所述
upvote: function(postId) {
check(this.userId, String);
check(postId, String);
var affected = Posts.update({
_id: postId,
upvoters: {$ne: this.userId}
},{
$addToSet: {
upvoters: this.userId
},
$inc: {
upvotes: 1
}
});
if (! affected)
throw new Meteor.Error('invalid', "You already up-voted this post");
},
downvote: function(postId) {
check(this.userId, String);
check(postId, String);
var affected = Posts.update({
_id: postId,
downvoters: {$ne: this.userId},
}, {
$addToSet: {
downvoters: this.userId
},
$inc: {
downvotes: 1
}
});
if (! affected)
throw new Meteor.Error('invalid', "You already down-voted this post");
},
使用上面的代码,用户可以进行一次upvote和downvote,但他们可以做到这两点......
如果用户是downvoter并点击upvote,我会编写代码,但我无法弄清楚如何检查用户是下注者还是upvoter。
$pull: {
downvoters: this.userId
},
$addToSet: {
upvoters: this.userId
},
$inc: {
downvotes: -1
},
$inc: {
upvotes: 1
});
编辑:即使接受的答案正常,我也发现了问题。单击快速时,可能会将投票次数增加2-3次。我只是插入userId而不是增加投票数,而只是计算upvoters / downvoters数组中有多少ID,它们给出相同的结果&它永远不会两次插入相同的userId。
计数帮助者内部:
return this.upvoters.length
此外,inArray是一个有用的工具,用于检查您的值是否在数组中。
if($.inArray(Meteor.userId(), this.upvoters)) //gives true if the current user's ID is inside the array
答案 0 :(得分:4)
您必须获取帖子并查看其是否包含用户downvoters
数组中的ID:
var post = Posts.findOne(postId);
if (post.downvoters && _.contains(post.downvoters, this.userId)) {
Posts.update({
_id: postId
},
{
$pull: {
downvoters: this.userId
},
$addToSet: {
upvoters: this.userId
},
$inc: {
downvotes: -1,
upvotes: 1
}
}
});
}