[英]Iron router: Don't re-render page if wait on changes
我使用铁路由器的waitOn功能订阅了一个集合。 此订阅依赖于Session变量。当Session变量更改时,应使用Session变量的新值来续订。
这可以正常工作,但是有一个问题:当会话变量更改时,页面将进行完全重新呈现。 但是,我只想更改数据。
是否有可能避免这种重新呈现行为,而仅在Session变量更改时重新订阅?
谢谢,
托尼
在计算中调用waitOn
并使它无效(例如,当Session
变量更改时)将导致您的路由控制器重新计算所有内容。 因此,基本上,您只应基于来自this.params
对象的数据在waitOn
内部进行预订。 这就是它的设计目的。
如果您想要其他行为并使订阅参数依赖于某些Session变量,那么它可能与路由器没有任何关系。 在这种情况下,您可能应该使用答案中所述的Deps.autorun
模式。
显然,我想要的是不可能的。 我发现的解决方案如下:
我没有使用waitOn进行订阅,而是在Template.rendered回调中订阅了Deps.autorun。
您只想等待第一个订阅。 为此,您需要在非反应范围内进行订阅。 要从反应式范围内达到非反应式范围,您需要使用Tracker.nonreactive(function) 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 */);
}
});
});
关于它在做什么的一些信息。 这是对路由的嵌套计算,可以随意重新运行,并带有一些全局变量来跟踪计算和我们不想处理的预订变化。 我们订阅了两次订阅,一次处于非反应状态,其中更改不会影响订阅。 这是我们用来计算是否渲染的对象。 然后,当该订阅准备就绪时,我们将进行渲染,并在那时重新订阅一个反应性变量。 流星很聪明,它可以将新订阅识别为旧订阅,并且只会基于此订阅更新minimongo记录。 这允许有效地无缝重绘。 最后,有一个Calculation.invalidate,它使内部计算重新运行,因为这是一个预订(使预订的存在是反应性的,而预订本身是非反应性的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.