根据the docs:
如果您在反应计算中调用Meteor.subscribe,例如使用Tracker.autorun,则在计算失效或停止时,订阅将自动取消;
然后明确提到不需要在autorun
内停止订阅。
流星助手也是如此吗?我相信它们算作reactive computation
,但我不完全确定!
修改
这是一段代表情况的代码。
接下来的问题是:我是否需要做一些事情来阻止objectsSub
或者它是否自动排序?
<template name ="Foo">
{{#with myContext}}
{{#each objects}}
<!--Show stuff-->
{{/each}}
{{/with}}
</template>
Template.Foo.onCreated(function(){
this.subscribe('myContextSub');
});
Template.foo.helpers({
myContext(){
return MyContextCollection.findOne();
},
objects(){
Meteor.Subscribe('objectsSub',this.someContextAttribute);
return ObjectsCollection.find({});
},
});
答案 0 :(得分:1)
我不喜欢在有副作用的助手中做任何事情,例如去服务器。一个帮助器可以在模板处于活动状态时被多次调用,所以它应该只是返回一个值。
在您的情况下,至少我会将订阅绑定到模板,因此当模板被销毁时订阅消失。 e.g。
Template.foo.helpers({
objects() {
Template.instance().subscribe('objectsSub',this.someContextAttribute);
return ObjectsCollection.find({});
},
});
更有可能,我会处理这个&#34;加入&#34;在服务器端,当主集合(myContextSub)发布时。但是只有当奴隶集合(objectsSub)不被认为是被动的时候才会这样做。 (在发布中,您可以在添加和更改的事件上设置侦听器,并向已发布的对象添加额外的字段,即来自objectsSub的数据)。
如果objectsSub将被激活,那么我可能会在模板的onCreated()中处理订阅。在客户端上,您将在主集合上设置添加的侦听器,然后在发布主集合中的项目时订阅相关的从集合。然后帮助程序可以像现在一样简单地执行find()。 e.g。
Template.foo.onCreated(function() {
let self = this;
self.subscribe('myContextSub');
let cursor = MyContextCollection.find();
cursor.observe({
added: function(newDocument) {
// loop through the objects on newDocument, pulling out the context attributes to subscribe one or more times...
self.subscribe('objectsSub', someContextAttribute[s]);
},
changed: function(newDocument, oldDocument) {
// same as added
}
});
});
现在奴隶助手可以更简单:
Template.Foo.helpers({
myContext() {
return MyContextCollection.findOne();
},
objects() {
return ObjectsCollection.find({});
},
});
在第二个例子中,可能有点奇怪的是我使用find()而不是你正在使用的findOne(),以便以这种方式访问侦听器。所以也许您需要检查它在客户端上发布或过滤的方式。
如果你想坚持使用findOne(),同样的概念适用:一旦返回数据,你可以检查它并订阅你所需的奴隶集合。
答案 1 :(得分:1)
您可以使用此chrome extension查看meteor订阅和取消订阅的时间。正如@jordanwillis所指出的那样,你可能会在帮助器中看到它取消订阅。另外,我建议这个server transform package在一个订阅中执行所有操作,而不是在帮助程序中。