带参数的模板订阅行为

时间:2015-05-06 12:42:18

标签: templates meteor publish-subscribe

我有关于模板订阅的问题。我发现,不是一个错误,而是一个不酷的行为,请考虑以下因素:

路由器(铁路由器):

this.route('test', {
  path '/test/:_id'
});

然后是模板订阅:

Template.test.onCreated(function () {
  this.subscribe('mydata', Router.current().params._id);
});

基本上是一个路由,其中​​subscribe链接到路由参数给出的id。

然后,如果我有两个这样的链接:

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

as / test / hello和/ test / hi共享相同的模板,onCreated from test只调用一次(onRendered相同)。这意味着订阅将存在于id:hello,但不存在于id:hi(因为onCreated被调用一次为hello)。

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

总之,如果有些人没有得到它: 两个页面,相同的路由(带参数),相同的模板,onCreated / onRendered只调用一次,但路由参数更改,所以它应该有两个订阅。但由于onCreated / onRendered仅被调用一次(因为它们共享相同的模板),因此只存在一个订阅。如何使用模板订阅方法来处理这种情况?

1 个答案:

答案 0 :(得分:1)

您可以在onCreated生命周期事件中使用反应计算。

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

Router.current()作为被动数据源,只要通过导航修改当前路线,this.autorun的内部反应计算设置就会重新运行。

Tracker.autorun内拨打的订阅会自动停止并重新订阅(如果参数已修改)。