6

使用 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
        }
     });
   }
});

现在问题来了,当我渲染问题视图并更新问题项时,视图再次刷新,因为它是一个反射页面。然后是无限循环。

有人有建议吗?

4

4 回答 4

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'当您实际更改用户正在处理的逻辑问题时才更改会话变量。

于 2012-12-13T09:38:21.667 回答
1

我通过使用流星收集挂钩解决了这个问题

首先安装它

>_ meteor add matb33:collection-hooks

然后在你的模型中

Questions.after.findOne(function (userId, selector, options, doc){
    Questions.update({_id: doc._id},{$inc:{views:1}});
});

KABOOM就是这样

于 2015-11-05T03:32:06.303 回答
0

而不是放入一个助手,我会把这个逻辑放入渲染的事件中,即。

Template.questionview.rendered ...

请参阅Meteor 文档

于 2012-12-09T04:37:47.730 回答
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);}});

这样,每次用户打开浏览器时,您只需增加一次计数。

于 2016-03-04T23:54:02.383 回答