Meteor保留旧的订阅数据,直到新的订阅日期准备就绪

时间:2016-12-14 20:36:27

标签: meteor meteor-blaze

我的桌子闪烁,因为我的订阅正在自动运行中重新进行。当在自动运行中再次调用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();
  },
});

来自meteor guide

  

服务器显式等待,直到所有数据都被发送下来(新的   在删除之前,新订阅的订阅已准备就绪   来自旧订阅的数据。这里的想法是避免闪烁 - 你   如果需要,可以继续显示旧订阅的数据,直到   新数据准备就绪,然后立即切换到新数据   订阅的完整数据集。

     

这意味着一般来说,在更改订阅时,会有   是一个过度订阅的时期,有更多的数据   客户比你严格要求的。这是非常重要的一点   为什么你应该总是获取你拥有的相同数据   订阅(不要“过度获取”)。

我想“继续显示旧订阅的数据,直到新数据准备好,然后立即切换到新订阅的完整数据集”但我该怎么做?

1 个答案:

答案 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 );
    }
});