繁体   English   中英

铁路由器:如果等待更改,请不要重新渲染页面

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM