[英]Meteor.js: How to periodically query collection documents from view
我认为我希望基本上是一个动态幻灯片:
collection.findOne()
请求) 这听起来像是一个典型的jquery _GET请求,但知道“流星”的做法会很好。
这基本上是我想要做的出发点:
// week_player.js
var randomWeekInterval;
// triggered when page is first loaded
Template.weekPlayer.rendered = function(){
console.log('rendered!');
var tick = 0;
randomWeekInterval = Meteor.setInterval(function(){
console.log('week interval update ' + (tick++));
var weekCount = Weeks.find().count();
var randomWeekId = Math.floor(weekCount * Math.random());
var randomWeek = Weeks.findOne(randomWeekId);
// TODO: add some sort of listener for when the week is loaded
// and trigger newDataHandler with the data
}, 10 * 1000); // repeat every 10 seconds
}
// triggered when the new data is loaded
Template.weekPlayer.newDataHandler = function(data){
// got new data! here it is:
console.log(data);
}
// triggered when leaving page: stop doing the interval
Template.postPage.destroyed = function(){
Meteor.clearInterval(randomWeekInterval);
}
尝试这样的事情:
_.extend(Template.weekPlayer, {
created: function() {
this.randomWeekInterval = Meteor.setInterval(function() {
Session.set("randomWeekIndex", Math.floor(Weeks.find().count() * Math.random()));
}, 10 * 1000);
},
destroyed: function() {
Meteor.clearInterval(this.randomWeekInterval);
},
week: function() {
return Weeks.findOne({}, {
skip: Session.get("randomWeekIndex"),
transform: function(doc) {
// Here's where you can manipulate the object after it is retrieved
return doc;
}
});
}
});
现在,您可以直接从模板中获取周对象,每当Session
var更改时,它将自动更改为新周:
<template name="weekPlayer">
{{#with week}}
Start Date: {{startDate}} <br/>
End Date: {{endDate}}
{{/with}}
</template>
几点说明:
间隔在created
回调中设置,而不是在rendered
。 这是为了确保每个clearInterval
始终只有一个setInterval
。 如果它在rendered
回调中,则每次渲染模板时都会设置一个新间隔,这可能是数百次。 您也会丢失对间隔对象的引用。
因为我们在created
和destroyed
回调中引用了此区间, this
您可以拥有多个幻灯片,每个幻灯片都有自己的间隔对象。
我们使用Session
来存储随机索引。 每次运行Session.set("randomWeekIndex", "someValue")
时,模板助手函数Template.weekPlayer.week
将自动重新运行。 然后,模板将自动重新渲染,因为它取决于week
助手。
HTML部分假定您的week
对象具有startDate
和endDate
字段。 它们当然可以遵循任何结构, transform
选项允许您在显示它们之前修改它们的结构。 如果对象findOne
,则可以从findOne
调用中删除transform
选项。
我正在使用_.extend
的_.extend
来简洁。 如果您之前没有看过这个,那就像说:
Template.weekPlayer.created = function() { /* ... */ }; Template.weekPlayer.destroyed = function() { /* ... */ }; // ...
最后一点 - 在使用Meteor时,您应该很少使用jQuery。 每当你需要与Meteor服务器交谈时,你想使用Meteor方法而不是jQuery AJAX。 每当您需要从服务器获取数据时,您都希望使用发布/订阅。 每当你想要进行基本的DOM操作时,你就会让模板和反应辅助函数(例如Template.weekPlayer.week
)为你做这些,就像我在这里看到的那样。
会话变量是被动的。 您可以在weekPlayer模板上使用模板助手来返回Session对象
模板助手
Template.weekPlayer.helpers({
currentSlide: function(){
return Session.get('currentSlide');
}
});
模板
<template name="weekPlayer">
{{currentSlide}}
</template>
定期更新
var tick = 0;
Meteor.setInterval(function() {
// update contents of slide data
tick += 1;
// set currentSlide Session object -- which triggers a redraw
Session.set('currentSlide', tick);
}, 1000);
现在请注意,您可能需要调用Meteor.setInterval并将其移到Template.weekPlayer.rendered函数之外。 这样你每次重绘时都不会创建一个新的Meteor.setInterval(或使用Meteor.clearInterval - 只是一些机制来阻止调用Session.set意外)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.