Javascript 铁路由器:Don';如果等待更改,请不要重新呈现页面

Javascript 铁路由器:Don';如果等待更改,请不要重新呈现页面,javascript,session,meteor,iron-router,Javascript,Session,Meteor,Iron Router,我使用iron router的waitOn功能订阅了一个集合。此订阅依赖于会话变量。当会话变量更改时,应使用会话变量的新值续订 这很好,但有一个问题:当会话变量更改时,页面会进行完全的重新加载。然而,我只想改变数据 是否有可能避免这种重新登录行为,并在会话变量更改时重新订阅 谢谢, 托尼显然,我想要的是不可能的。我找到的解决办法如下: 我没有使用waitOn订阅,而是在Template.rendered回调中订阅Deps.autorun。waitOn在计算中被调用,并使其无效(例如,当会话变量更

我使用iron router的waitOn功能订阅了一个集合。此订阅依赖于会话变量。当会话变量更改时,应使用会话变量的新值续订

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

是否有可能避免这种重新登录行为,并在会话变量更改时重新订阅

谢谢,


托尼显然,我想要的是不可能的。我找到的解决办法如下:


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

waitOn
在计算中被调用,并使其无效(例如,当
会话
变量更改时),将导致路由控制器重新计算所有内容。因此,基本上,您应该只在
waitOn
内订阅基于
this.params
对象的数据。这就是它的设计目的


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

您想要的是只等待第一次订阅。要做到这一点,您需要在非反应性范围内订阅。要从反应作用域中访问非反应作用域,您需要使用Tracker。非反应(函数)这样做将使您无需重新订阅即可访问所需的值。在这种情况下,我将使用route方法:

请注意,这是我编写的未经测试的代码。请随意修改和调整

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记录。这允许有效地无缝重画。最后是computation.invalidate,它会导致内部计算重新运行,因为这是一个订阅(使订阅的存在成为反应性的,而订阅本身是非反应性的)。

您好,这可能会帮助您感谢您的评论,但这并不能真正解决我遇到的问题