2016-04-08 35 views
2

我試圖跟蹤流星中某個反應值的增量。如果當前值增加了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(); 
    }, 
    }) 
} 

所以有車在城市的電流量。每當有一輛車的時候,我想要在代碼中發生一些事情。但是我怎麼能這樣做呢?也許通過跟蹤數據庫何時更新?

回答

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模板代碼。