2016-05-28 56 views
0

我有一個小問題搞清楚如何使一個訂閱反應某些發佈查詢。製作一份反應時間流星發佈

我的出版物如下:

Meteor.publish('allData', function(){ 
    return Data.find({TTL: {$gt: new Date()}}) 
}) 

正如你可以看到,這些文件包含TTL字段。只要生存時間比當前時間更長,它可以發送給客戶端,如果沒有,它不應該。

訂閱:

this.autorun(() => { 
    this.subscribe('allData') 
}) 

在初始負載,所有數據是好的,但每當TTL到期時,文檔保留在客戶端上,除非我重新加載頁面。無論如何要處理這種反應,使過期的文件從客戶端消失?

+0

問題是'new Date()'不是被動數據,並且發佈不會隨着時間的改變而被重新評估。 – aedm

回答

1

ReactiveVar的組合和一個自動運行的伎倆爲了我。這可能是矯枉過正,但它有效。

let cutoffTimestamp = new ReactiveVar(); 

Meteor.setInterval(function() { 
    cutoffTimestamp.set(Date.now() - 1); 
}, 60000); 

Meteor.publish("myPub", function() { 
    this.autorun(function() { 
     return myCollection.find({ timestamp: { $gte: cutoffTimestamp.get(); } }); 
    }); 
}); 
+0

感謝您的回答Johan,您認爲Michel Floyd的答案與您的答案類似嗎?考慮到它使用反應包代替reactiveVar? –

+0

Michel的答案很好,因爲它使得時間成爲一個被動數據源,所以它解決了你的具體問題。我的回答展示瞭如何做出一些不具有反應性的事情,並且可能會對其他遇到此問題的人有益。 – Teetow

0

使用remcoder:chronos包,使時間本身反應然後執行:

客戶端:

Meteor.subscribe('allDataSince',Chronos.currentTime()); 

服務器:

Meteor.publish('allDataSince', t => Data.find({ TTL: { $gt: t }})); 
+0

這很有道理,與Johan Althoff的答案類似,但似乎並不奏效。這可能與我在'/ imports'文件夾中工作有關嗎? –

+0

可能 - 您可能需要導入Chronos –

+1

流星發佈函數不會自行處理反應性。你應該在你的發佈函數中的'autorun'裏面加入反應性。然後'chronos'可以工作。要獲得對'autorun'的支持,你應該使用[reactive-publish](https://github.com/peerlibrary/meteor-reactive-publish)包。 – Mitar