我正在尝试在我的应用程序中实现分页而不使用外部库,但我遇到了问题。我看到了一些其他主题,但它们似乎不适用于我的用例(或者完全遇到不同的问题)。这是我的模板。
{{#if Template.subscriptionsReady}}
{{#each posts}}
{{> postPreview}}
<hr>
{{/each}}
{{else}}
{{> spinner}}
{{/if}}
<!-- Pager -->
<ul class="pager">
{{#if showNewerPostsButton}}
<li class="previous previousButton">
<a>← Newer Posts </a>
</li>
{{/if}}
{{#if showOlderPostsButton}}
<li class="next nextButton">
<a>Older Posts →</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
参数的更改并运行我的template.autorun
(如下)。我解决这个问题的第一个想法是使用Meteor.subscribe()
's 返回handle
订阅handle.stop()
。不幸的是,似乎在这个函数内部,两者this.subscribe()
都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);
});
});
我这样做对吗?为我指明正确方向的任何帮助都非常棒——我已经尝试让分页工作几天了,但一直遇到障碍。