2016-12-14 38 views
2

我的表閃爍,因爲我的訂閱在自動運行中重新記錄。當自動運行中再次調用訂閱時,我的數據將消失,並且我有一個空表,直到Data.find()再次運行。如何保留數據,直到新數據準備就緒?流星保留舊訂閱的數據,直到新訂閱日期準備就緒

Template.table.onCreated(function() { 
    this.autorun(() => { 
    if (Session.get('selectedItem') && selectedSubItem.get()) { 
     this.subscribe('dataOverview', Session.get('selectedItem'), selectedSubItem.get()._id); 
    } 
}); 

Template.table.helpers({ 
    collection() { 
    return Data.find({"item._id": Session.get('selectedItem')._id, "subItem._id": selectedSubItem.get()._id}); 
    }, 

我也嘗試了一種不同的方式,以查看它是否實際上是下面的代碼的訂閱數據問題。在自動運行之後,在查找運行第二次之前,表格是空的。

Template.table.onCreated(function() { 
    this.autorun(() => { 
    if (Session.get('selectedItem') && selectedSubItem.get()) { 
     this.subscribe('dataOverview', Session.get('selectedItem'), selectedSubItem.get()._id,() => { 
     let cursor = Prjs.find({"app._id": Session.get('selectedApp')._id,"release._id": selectedRel.get()._id}); 
     this.tableData.set(cursor); 
     }); 
    } 
}); 

Template.table.helpers({ 
    collection() { 
    return Template.instance().tableData.get(); 
    }, 
}); 

meteor guide

服務器明確的等待,直到所有的數據從舊的訂閱取出 數據之前下發(新 訂閱就緒),新訂閱。這裏的想法是爲了避免閃爍 - 如果需要,您可以繼續顯示舊訂閱的數據,直到 新數據準備就緒,然後立即切換到新訂購的完整數據集 。

這意味着什麼,一般來說,當更改訂閱時, 會是一個您超額訂閱的期間,並且客戶端上的數據比您嚴格要求的要多。這是一個非常重要的原因,因爲您應該始終獲取與訂閱的 相同的數據(不要「過度獲取」)。

我想「繼續顯示舊訂閱的數據,直到新數據準備好,然後立即切換到新訂閱的完整數據集」,但我該怎麼做?

+1

您是否嘗試過使用[meteorhacks:subs-manager](https://atmospherejs.com/meteorhacks/subs-manager)? – JeremyK

+0

然後創建一對響應變量,在訂閱準備就緒時保留新值,並在此之前保留舊值。您的問題似乎是您依靠相同的無功變量進行訂閱和數據提取的事實。 – MasterAM

+0

@MasterAM這是一個好主意,但它不起作用。請參閱上面的編輯 – Simon

回答

0

解決此問題的最佳解決方案是使用一個訂閱緩存包,如:

meteorhacks:subs-manager是原來的溶液中,並且是一個由Arunoda開發的許多軟件包。這是一個可靠的選擇,但請注意,它不再被主動維護。

ccorcos:subs-cache本質上是meteorhacks:subs-manager的一個分支,它已修正了一些問題,並且是currently being maintained

當您在客戶端上訂閱時,這兩個軟件包都需要稍微不同的語法,併爲您的訂閱提供緩存以消除您在問題中描述的閃爍。

// using ccorcos:subs-cache 

let subsCache = new SubsCache({ 
    expireAter: 5, // minutes 
    cacheLimit: 10 
}); 

Template.table.onCreated(function() { 
    this.autorun(() => { 
    if (Session.get('selectedItem') && selectedSubItem.get()) { 
     subsCache.subscribe('dataOverview', 
          Session.get('selectedItem'), 
          selectedSubItem.get()._id); 
    } 
}); 
+0

我們如何知道meteorhacks:副經理是否更長時間保持?最後一次提交是2016年3月21日,這是不是很久以前 – Simon