是否有必要停止使用Meteor订阅助手级订阅?

时间:2017-02-23 03:18:03

标签: meteor publish-subscribe meteor-blaze

根据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({});
 },
});

2 个答案:

答案 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在一个订阅中执行所有操作,而不是在帮助程序中。