2016-04-20 4 views
2

Я пытаюсь реализовать разбиение на страницы в своем приложении без использования внешних библиотек, и у меня возникают проблемы. Я видел несколько других тем по этому поводу, но они, похоже, не применялись к моему варианту использования (или вообще возникали разные проблемы). Вот мой шаблон.Meteor отписаться от Collection on Client

{{#if Template.subscriptionsReady}} 
    {{#each posts}} 
    {{> postPreview}} 
    <hr> 
    {{/each}} 
{{else}} 
    {{> spinner}} 
{{/if}} 

<!-- Pager --> 
<ul class="pager"> 
    {{#if showNewerPostsButton}} 
    <li class="previous previousButton"> 
     <a>&larr; Newer Posts </a> 
    </li> 
    {{/if}} 
    {{#if showOlderPostsButton}} 
    <li class="next nextButton"> 
     <a>Older Posts &rarr;</a> 
    </li> 
    {{/if}} 
</ul> 

В принципе так оно и должно работать в том, что, когда пользователь нажимает одну из кнопок, сервер должен получить следующие элементы в наборе записей и «идеально» обновить подписку, чтобы соответствовать. У меня возникли проблемы с тем, что набор записей подписки соответствует тому, что я хочу: похоже, Meteor ведет сбор записей с каждой новой подпиской.

Template.postsList.events({ 
    'click .nextButton': (e) => { 
    let page = parseInt(FlowRouter.getParam('page')); 
    if (page === undefined || isNaN(page)) { 
     page = 0; 
    } 
    FlowRouter.setParams({ page: page + 1 }); 
    }, 
    'click .previousButton': (e) => { 
    let page = parseInt(FlowRouter.getParam('page')); 
    if (page === undefined || isNaN(page) || page < 1) { 
     page = 1; 
    } 

    FlowRouter.setParams({ page: page - 1 }); 
    }, 
}); 

Прямо сейчас, когда я нажимаю кнопку, что я уверен, что происходит в Meteor видит мое изменение в FlowRouter Params и работает мой template.autorun (ниже). Моей первой мыслью решить эту проблему было использование Meteor.subscribe() с возвратом handle в handle.stop() подписки. К сожалению, кажется, что внутри этой функции оба и Meteor.subscribe() не возвращают фактический дескриптор, который может быть использован для подписки handle.stop() и вместо этого возвращает строку subscriptionId. Я не знаю, как использовать эту строку, или даже если можно ее использовать.

Template.postsList.onCreated(function() { 
    var self = this; 
    self.autorun(function() { 
    var page = parseInt(FlowRouter.getParam('page')); 
    if (page == undefined || page < 0 || isNaN(page)) { 
     page = 0; 
    } 
    var handle = Session.get('postPreviewsHandle'); 
    if (handle) { 
     console.dir(handle); 
     handle.stop(); // Error! Function doesn't exist because this is only a string 
    } 

    // Meteor.subscribe() behaves the same way here 
    handle = self.subscribe('postPreviews', page); 

    Session.set('postPreviewsHandle', handle); 
    }); 
}); 

Имею ли я это право? Любая помощь в том, чтобы указывать на меня в правильном направлении для этого, была бы супер фантастической - я пыталась получить разбивку на страницы, работающую пару дней и продолжаю сталкиваться с препятствиями.

ответ

0

Я не знаю, если переменная сеанса может хранить handle, но вы можете попробовать и добавить его на экземпляр шаблона (self) вместо

Template.postsList.onCreated(function() { 
    var self = this; 
    self.autorun(function() { 
    var page = parseInt(FlowRouter.getParam('page')); 
    if (page == undefined || page < 0 || isNaN(page)) { 
     page = 0; 
    } 
    var handle = self.handle; 
    if (handle) { 
     console.dir(handle); 
     handle.stop(); 
    } 

    self.handle = self.subscribe('postPreviews', page); 
    }); 
}); 
+1

Спасибо за ответ! К сожалению, вызов 'subscribe()' AT ALL внутри 'autorun()' заставляет Meteor возвращать строку. Из-за этого Afaik не может «остановить()» подписку на уровне шаблона вручную. – deathgaze