代码之家  ›  专栏  ›  技术社区  ›  tomet

熨斗路由器:如果等待更改,则不重新渲染页面

  •  0
  • tomet  · 技术社区  · 10 年前

    我使用熨斗路由器的waitOn功能订阅了一个集合。此订阅依赖于Session变量。当Session变量更改时,应使用Session变量的新值续订订阅。

    这很好,但有一个问题:当会话变量更改时,页面会进行完整的重读。然而,我只想改变数据。

    是否可以避免这种重新订阅行为,并在Session变量更改时重新订阅?

    非常感谢。

    托尼

    3 回复  |  直到 10 年前
        1
  •  1
  •   Tomasz Lenarcik    10 年前

    waitOn 在计算中调用并使其无效(例如 Session 变量更改)将导致路由控制器重新计算所有内容。所以基本上,你应该只在内部订阅 等待 基于来自 this.params 对象这就是它的设计目的。

    如果您想要另一种行为,并使订阅参数依赖于某些会话变量,那么它可能与路由器无关。在这种情况下,您可能应该使用 Deps.autorun 你在回答中描述的模式。

        2
  •  0
  •   tomet    10 年前

    显然,我想要的是不可能的。我找到的解决方案如下:

    我不是使用waitOn订阅,而是在Template.rendered回调中订阅Deps.autorun。

        3
  •  0
  •   lassombra    10 年前

    您希望的是只等待第一次订阅。为此,您需要在非反应范围内订阅。要从反应范围内到达非反应范围,需要使用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记录。这允许有效地无缝重新绘制。最后是calculation.invalidate,它导致内部计算重新运行,因为这是一个订阅(使订阅的存在是反应性的,而订阅本身是非反应性的)。