Meteor:使用Iron Router修改路由更改的集合

时间:2015-08-02 01:37:40

标签: meteor iron-router

所以我正在开发一个论坛类型的应用程序。当用户导航到帖子时,网址将为www.myapp.com/post/POSTID。我使用Iron Router来处理路由。

进入和离开这篇文章后,我想update一个集合,表明用户已经看过帖子。我知道在Iron Router中,如果修改了路由订阅的其中一个基础订阅,则会遇到无限的反应循环。我之前尝试更新action()中的集合,但是获得了无限循环。

所以我在路线中将update移到了onRun()。无限循环消失了,但onRun()的问题在于它不会在热重载时触发。每次我进行代码更改和Meteor热重新加载时,都不会调用onRun()代码。我必须手动执行ctrl-R重新加载浏览器才能实际调用onRun()代码。

1 个答案:

答案 0 :(得分:2)

出于几个原因,我不会使用铁路由器功能更新此类值,从您的目标开始:

  

我想更新一个集合,以表明用户已看到帖子

如果您需要,您可以做的最少的事情是在渲染模板后更新。如果不这样做,只需点击指向另一个页面的页面链接,就会将其标记为用户看到的内容。

更好的是,您可以观看active事件并在此事件上触发setInterval()。这样你就可以确保

  1. 页面已加载
  2. 页面处于活动状态
  3. 它已激活至少x秒
  4. 看起来像这样:

    Template.yourTemplate.rendered = function() {
    $(window).focus(function() { //for 3 seconds
        Meteor.setInterval(function(){
          //your update query
        }, 3000);
    });
    

    拦截用户离开页面的部分比较棘手。我刚刚找到了一种方法,所以我将分享。

    • 订阅您的路由控制器(您已经这样做了)。这样,route loaded = subscription activeroute left = subscription stopped

    • onStop()函数添加到发布函数中,并将用户离开页面时需要执行的所有服务器端代码放入其中。在您的情况下,它将是与显示的帖子相关的更新。以下是我的出版物的外观(当页面遗漏时尚未提交相关表单时删除上传的文件),您应该能够根据自己的需要对其进行调整:

      Meteor.publish("files", function(sessionId) {
        var self = this;
      
        // Here I clean all the files I need to remove because the user has
        // not submitted the current form. 
        self.onStop(function () {
            console.log (sessionId + " is cleaning...");
            cleanFiles(sessionId)
        });
      
        // I look for files related to the current upload session only
        if(Users.isInRoles(this.userId, ["user"])) {
          return Files.find({"session_id":sessionId, "owner":this.userId}, {});
        }
        //and I make my publication available in case the if statement failed
        return self.ready();
      });
      };