Templates 带参数的模板订阅行为

Templates 带参数的模板订阅行为,templates,meteor,publish-subscribe,Templates,Meteor,Publish Subscribe,我有一个关于模板订阅的问题。我发现,不是一个bug,而是一个不酷的行为,考虑如下: 路由器(铁路由器): 然后,模板订阅: Template.test.onCreated(function () { this.subscribe('mydata', Router.current().params._id); }); 基本上是一个路由,其中subscribe链接到route参数给定的id 那么,如果我有两个这样的链接: <a href="/test/hello">hello<

我有一个关于模板订阅的问题。我发现,不是一个bug,而是一个不酷的行为,考虑如下:

路由器(铁路由器):

然后,模板订阅:

Template.test.onCreated(function () {
  this.subscribe('mydata', Router.current().params._id);
});
基本上是一个路由,其中subscribe链接到route参数给定的id

那么,如果我有两个这样的链接:

<a href="/test/hello">hello</a>
<a href="/test/hi">hello</a>

由于/test/hello和/test/hi共享同一个模板,因此onCreated from test只被调用一次(onRendered也是如此)。这意味着订阅将为id:hello而存在,但不为id:hi而存在(因为onCreated只为hello调用一次)

我避免了使用subs manager包在路由中移动订阅的问题。然而,我很想知道如何在模板中处理这些问题(我只是更喜欢模板知道的想法,而不是他需要执行什么订阅的路由)

简言之,如果有些人不明白:
两个页面,相同的路由(带参数),相同的模板,onCreated/onRendered只调用一次,但是路由参数改变了,所以它应该有两个订阅。但由于onCreated/onRendered只被调用一次(因为它们共享同一个模板),所以实际上只存在一个订阅。如何使用模板订阅方法处理这种情况?

您可以在创建的
生命周期事件中使用反应式计算

Template.test.onCreated(function () {
  this.autorun(function(){
    var currentRouteParamId = Router.current().params._id;
    this.subscribe('mydata', currentRouteParamId);
  }.bind(this));
});
Router.current()
作为一个反应数据源,每当通过导航修改当前路由时,
this.autorun
设置的内部反应计算将重新运行

跟踪器.autorun中进行的订阅调用将自动停止并重新订阅(如果修改了参数)

Template.test.onCreated(function () {
  this.autorun(function(){
    var currentRouteParamId = Router.current().params._id;
    this.subscribe('mydata', currentRouteParamId);
  }.bind(this));
});