如何在客户端集合增长时反应性地执行代码?

时间:2016-04-08 09:12:48

标签: javascript meteor

我试图跟踪Meteor中某个无效值的增量。如果当前值增加了1或更多,我想要发生一些事情。我确实有两个问题:

  • 首先:我不知道如何制作这个函数的if语句。
  • 第二:我不知道如何跟踪增长情况。

这是我现在的代码,使用Mongo.Collection cars(来自API):

api = DDP.connect('url');
const currentCars = new Meteor.Collection('cars', api);
const newCars = cars.find().count()

if (Meteor.isClient) {
  Template.currentCars.helpers({
    carsInCity: function() {
      return currentCars.find(
      {
        location: "city"
      }).count();
    },
  })
}

因此,目前该市的汽车数量还很多。每当还有一辆车时,我希望在代码中发生一些事情。但是我怎么能这样做呢?也许通过跟踪数据库何时更新?

1 个答案:

答案 0 :(得分:3)

一个相当直接的解决方案是存储current amount of data in that collection,然后运行reactive computation以查看是否有任何更改。

这样的事情:

let currentCarsCount = cars.find().count()

Tracker.autorun(function checkForAddedCars() {
  // cars.find() is our reactive source
  const newCarsCount = cars.find().count()

  if(newCarsCount > currentCarsCount) {
    currentCarsCount = newCarsCount
    // There's new cars, handle them now
    // ...
  }
})

您可能还想使用template-level autorun,这样您就无需管理停止checkForAddedCars。您还可以将currentCarsCount作为状态存储在template instance上,而不是作为一个悬而未决的孤独者。

例如:

Template.currentCars.onCreated(function() {
  const templateInstance = this;
  // equivalent:
  const templateInstance = Template.instance();

  templateInstance.currentCarsCount = cars.find().count();

  templateInstance.autorun(function checkForAddedCars() {
    // cars.find() is our reactive source
    const newCarsCount = cars.find().count();

    if(newCarsCount > templateInstance.currentCarsCount) {
      templateInstance.currentCarsCount = newCarsCount;
      // There's new cars, handle them now
      // ...
    }
  });
});

它还允许您从模板代码中的其他位置访问currentCarsCount