繁体   English   中英

Meteor.js:如何定期从视图中查询收集文档

[英]Meteor.js: How to periodically query collection documents from view

我认为我希望基本上是一个动态幻灯片:

  1. 加载视图
  2. 启动一个计时器,以便每隔X秒返回一个特定集合中的随机文档(典型的collection.findOne()请求)
  3. 加载该项时,触发附加数据的函数

这听起来像是一个典型的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回调中,则每次渲染模板时都会设置一个新间隔,这可能是数百次。 您也会丢失对间隔对象的引用。

  • 因为我们在createddestroyed回调中引用了此区间, this您可以拥有多个幻灯片,每个幻灯片都有自己的间隔对象。

  • 我们使用Session来存储随机索引。 每次运行Session.set("randomWeekIndex", "someValue")时,模板助手函数Template.weekPlayer.week将自动重新运行。 然后,模板将自动重新渲染,因为它取决于week助手。

  • HTML部分假定您的week对象具有startDateendDate字段。 它们当然可以遵循任何结构, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM