我的桌子闪烁,因为我的订阅正在自动运行中重新进行。当在自动运行中再次调用subscribe时,我的数据消失,我有一个空表,直到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();
},
});
服务器显式等待,直到所有数据都被发送下来(新的 在删除之前,新订阅的订阅已准备就绪 来自旧订阅的数据。这里的想法是避免闪烁 - 你 如果需要,可以继续显示旧订阅的数据,直到 新数据准备就绪,然后立即切换到新数据 订阅的完整数据集。
这意味着一般来说,在更改订阅时,会有 是一个过度订阅的时期,有更多的数据 客户比你严格要求的。这是非常重要的一点 为什么你应该总是获取你拥有的相同数据 订阅(不要“过度获取”)。
我想“继续显示旧订阅的数据,直到新数据准备好,然后立即切换到新订阅的完整数据集”但我该怎么做?
答案 0 :(得分: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 );
}
});