一起来看流星运行时,我有一个问题。
我有一个“问题”页,我想增加时,它呈现计数视图。
所以在我的模板函数我写的
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
}
});
}
});
现在,这里是问题,当我使这个问题的观点和更新问题的项目,因为它是一个反射页面视图再次刷新。 然后说到无限循环。
任何人有什么建议?
通常情况下,在这样的情况下,有一些碎关于模型。 在这种情况下,我相信这是“数图”的想法。 有很多方法可以正确地做到这一点。 递增它呈现不,因为你在做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;
});
因此,如何增加对用户界面的变化有何看法? 好吧,让我们这样做明确。 让我们增加观看次数的问题,改变只有当。
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'
会话变量当你真正改变用户正在与逻辑问题。
我通过使用解决了这个问题流星收集钩
首先安装
>_ meteor add matb33:collection-hooks
然后,在你的模型
Questions.after.findOne(function (userId, selector, options, doc){
Questions.update({_id: doc._id},{$inc:{views:1}});
});
和KABOOM完蛋了
而不是放在一个帮手,我会把这个逻辑经过渲染的情况下,即。
Template.questionview.rendered ...
见流星文档 。
如果您使用的发布和订阅(你绝对应该是这样),你可以做你喜欢的方法发布
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);}});
这样你只增加计数一次,每次用户打开浏览器。