我使用iron router的waitOn功能订阅了一个集合。此订阅依赖于Session变量。当Session变量发生更改时,应使用Session变量的新值续订订阅。
这很好用,但是有一个问题:当会话变量发生变化时,页面会完全重新呈现。但是,我只想改变数据。
以某种方式可以避免这种重新呈现行为,只是在Session变量发生变化时重新订阅?
谢谢,
Tony
答案 0 :(得分:1)
waitOn
并使其无效(例如,当Session
变量更改时)将导致路由控制器重新计算所有内容。所以基本上,你应该只根据来自waitOn
对象的数据在this.params
内订阅。这就是它的设计目标。
如果您想要其他行为并使您的订阅参数依赖于某些Session变量,那么它可能与路由器没有任何关系。在这种情况下,您应该使用您在答案中描述的Deps.autorun
模式。
答案 1 :(得分:0)
显然,我想要的是不可能的。我找到的解决方案如下:
我没有使用waitOn订阅,而是在Template.rendered回调中的Deps.autorun中订阅。
答案 2 :(得分:0)
您想要的只是等待第一次订阅。为此,您需要在非反应范围内进行订阅。要在反应范围内达到非反应范围,您需要使用Tracker.nonreactive(函数)http://docs.meteor.com/#/full/tracker_nonreactive这样做可以让您无需重新订阅即可访问所需的值。在这种情况下,我会使用路由方法:
请注意,这是我未经测试的代码。随意修改和调整。
Router.route('/path/:param', function(){
var self = this;
var computation, subscription;
Tracker.autorun(function(){
if (!computation)
computation = Tracker.currentComputation;
if (!subscription)
Tracker.nonreactive(function(){
subscription = self.subscribe('subscription', /*reactive var here */);
computation.invalidate();
});
if (subscription && subscription.ready()){
self.render('templateName');
self.subscribe('subscription', /*reactive var here */);
}
});
});
关于它在做什么。这是对路由进行嵌套计算,可以随意重新运行,一些全局变量用于跟踪计算和我们不想处理的订阅。我们订阅了两次订阅,一次处于非反应状态,其中变化不会影响它。这是我们用来计算是否渲染的那个。然后,我们在该订阅准备就绪时进行渲染,并在此时使用反应变量重新订阅。 Meteor很聪明,因为它将新订阅识别为与旧订阅相同,并且只会根据它更新minimongo记录。这允许有效地无缝重绘。最后是calculate.invalidate,它导致内部计算重新运行,因为这是一个订阅(使订阅的存在无效,而订阅本身是无效的)。