流星模板重装无限(Meteor template reload infinity)

2019-08-03 17:50发布

一起来看流星运行时,我有一个问题。

我有一个“问题”页,我想增加时,它呈现计数视图。

所以在我的模板函数我写的

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

现在,这里是问题,当我使这个问题的观点和更新问题的项目,因为它是一个反射页面视图再次刷新。 然后说到无限循环。

任何人有什么建议?

Answer 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'会话变量当你真正改变用户正在与逻辑问题。



Answer 2:

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

首先安装

>_ meteor add matb33:collection-hooks

然后,在你的模型

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

KABOOM完蛋了



Answer 3:

而不是放在一个帮手,我会把这个逻辑经过渲染的情况下,即。

Template.questionview.rendered ...

见流星文档 。



Answer 4:

如果您使用的发布和订阅(你绝对应该是这样),你可以做你喜欢的方法发布

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

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



文章来源: Meteor template reload infinity