使用Meteor运行时遇到问题。
我有一个"问题"我想在渲染时增加计数视图的页面。
所以在我的模板函数中我写了
Template.questionview.helpers({
question : function() {
if(Session.equals('main_template_name', 'question')) {
console.log(Session.get('question_id'));
Questions.update({
_id: Session.get('question_id')
}, {
$inc: {
views: 1
}
});
}
});
现在出现问题,当我渲染问题视图并更新问题项时,视图会再次刷新,因为它是一个反射页面。然后是无限循环。
有人有建议吗?
答案 0 :(得分:4)
通常情况下,在这种情况下,模型会出现问题。在这种情况下,我认为这是“计数观点”的想法。有很多方法可以正确地做到这一点。因为你在UI代码中进行模型化工作(在概念上和实现中都有缺陷),所以在渲染上增加它不是。
首先,存储用户在某处访问过的问题。为什么不在用户上使用{questionsVisited:[]}
属性?
使用Meteor.call(...)
方法调用来注册视图:
Meteor.methods({
viewQuestion: function(questionId) {
// check if the user hasn't visited this question already
var user = Meteor.users.findOne({_id:this.userId,questionsVisited:{$ne:questionId}});
if (!user)
return false;
// otherwise, increment the question view count and add the question to the user's visited page
Meteor.users.update({_id:this.userId},{$addToSet:{questionsVisited:questionId}});
Questions.update({_id:questionId},{$inc:{views:1}});
return true;
});
那么如何增加UI变化的视图呢?好吧,我们不要特别这样做。当问题发生变化时,让我们仅增加视图计数 。
Meteor.autorun(function () {
var questionId = Session.get("question_id");
Meteor.call('viewQuestion',questionId,function(e,r) {
if (r)
console.log("Question " + questionId + " logged an increment.");
else
console.log("Question " + questionId + " has already been visited by user " + Meteor.userId();
});
});
摆脱所有这些问题的助手......
这比你原来想要的更好。现在,对于同一用户,视图不会被计算两次。如果这是所需的行为,请删除questionsVisited
逻辑。
仅更改'question_id'
会话变量。
答案 1 :(得分:1)
首先安装
>_ meteor add matb33:collection-hooks
然后在你的模特中
Questions.after.findOne(function (userId, selector, options, doc){
Questions.update({_id: doc._id},{$inc:{views:1}});
});
KABOOM 就是这样
答案 2 :(得分:0)
答案 3 :(得分:0)
如果你正在使用发布和订阅(你绝对应该这样做),你可以在你的发布方法上做到这一点,如
Meteor.publish('posts', function(id) {
Posts.update({_id:id},{$inc:{view:1}});
return Posts.find({_id: id});
});
或订阅回拨
Meteor.subscribe("posts" , id {
onReady: function() { Meteor.call("incrementView", id);}});
这样,每次用户打开浏览器时,您只会增加一次计数。