2016-12-14 6 views
2

Моя таблица мерцает, потому что моя подписка снова подстраивается в автозапуск. Когда подписка вызывается снова в автозапуске, мои данные исчезают, и у меня есть пустая таблица, пока программа Data.find() снова не запустится. Как я могу сохранить данные, пока новые данные не будут готовы?Meteor сохраняет старые подписанные данные до тех пор, пока не будет готова новая подписанная дата.

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: subs-manager is no дольше поддерживаются? последний коммит был 21 марта 2016 года, который не так давно – Simon