流星取消订阅客户端上的集合
Meteor unsubscribe from 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>← 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()
返回的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);
});
});
我这样做对吗?任何帮助我指出正确的方向都会非常棒——我一直在尝试让分页工作几天,并不断遇到障碍。
我不知道
会话变量是否可以存储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);
});
});
相关文章:
- Meteor针对唯一客户端集合的发布/订阅策略
- 流星取消订阅客户端上的集合
- Meteor集合在服务器和客户端上有所不同
- 如何使用express/mongoose和客户端JS将HTML类发布到mongoDB集合中
- 客户端上的Meteor.js集合为空
- 在不使用集合的情况下将服务器端计算返回到客户端
- 流星:等待客户端排序的集合
- 从客户端 JavaScript 中的 Meteor 集合中获取数据
- 从服务器更新的 meteor 集合,不会在客户端上被动排序
- 将结构化的反应式数据发布到客户端(在数据库集合之外)
- 如何在metro.js中为图像集合添加描述(客户端和服务器端)
- 哪里可以更快地对集合进行排序?客户端还是服务器端
- 尝试在ASP.NET MVC 3中将对象集合从客户端传递到服务器
- Mongo客户端不能访问带有下划线前缀的集合
- 如何防止'值'发出集合的客户端上的事件
- 流星集合未在客户端更新订阅
- 更改所有客户端的Meteor集合订阅
- 流星JS -客户端集合似乎是空的
- 不能使用CoffeeScript在meteor中创建仅用于客户端的集合
- 当一个集合被修改时,流星会向客户端推送多少数据