【问题标题】:Meteor template reload infinity流星模板重新加载无限
【发布时间】:2012-11-26 10:36:30
【问题描述】:

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

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

有人有建议吗?

【问题讨论】:

    标签: loops meteor infinity


    【解决方案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;
    });
    

    那么如何增加 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' 会话变量。

    【讨论】:

    • 你太棒了。我应该记录访问过的 user_id 有问题或 user 中的 question_id,就像你建议的那样。我认为您的解决方案更清洁。我仍然是 Meteor 的学习者。我能问我为什么要摆脱 helper 的东西吗?
    【解决方案2】:

    我通过使用meteor-collection-hooks解决了这个问题

    先安装

    >_ meteor add matb33:collection-hooks
    

    然后在你的模型中

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

    还有KABOOM就是这样

    【讨论】:

      【解决方案3】:

      我会将此逻辑放入渲染的事件中,而不是放入帮助程序,即。

      Template.questionview.rendered ...
      

      the Meteor docs

      【讨论】:

      • 感谢您的帮助。我之前真的试过了。然而它是一样的。我想这是因为在我更新问题后,问题视图模板将被重新渲染。一旦重新渲染,问题就会更新,依此类推...
      • 我不确定是否有办法告诉流星不要刷新页面。我的意思是也许要求 Meteor 不要再次刷新视图。
      【解决方案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);}});
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        相关资源
        最近更新 更多