所以我正在开发一个论坛类型的应用程序。当用户导航到帖子时,网址将为www.myapp.com/post/POSTID
。我使用Iron Router来处理路由。
进入和离开这篇文章后,我想update
一个集合,表明用户已经看过帖子。我知道在Iron Router中,如果修改了路由订阅的其中一个基础订阅,则会遇到无限的反应循环。我之前尝试更新action()
中的集合,但是获得了无限循环。
所以我在路线中将update
移到了onRun()
。无限循环消失了,但onRun()
的问题在于它不会在热重载时触发。每次我进行代码更改和Meteor热重新加载时,都不会调用onRun()
代码。我必须手动执行ctrl-R
重新加载浏览器才能实际调用onRun()
代码。
答案 0 :(得分:2)
出于几个原因,我不会使用铁路由器功能更新此类值,从您的目标开始:
我想更新一个集合,以表明用户已看到帖子
如果您需要,您可以做的最少的事情是在渲染模板后更新。如果不这样做,只需点击指向另一个页面的页面链接,就会将其标记为用户看到的内容。
更好的是,您可以观看active
事件并在此事件上触发setInterval()
。这样你就可以确保
看起来像这样:
Template.yourTemplate.rendered = function() {
$(window).focus(function() { //for 3 seconds
Meteor.setInterval(function(){
//your update query
}, 3000);
});
拦截用户离开页面的部分比较棘手。我刚刚找到了一种方法,所以我将分享。
订阅您的路由控制器(您已经这样做了)。这样,route loaded
= subscription active
和route 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();
});
};