Javascript 铁路由器:Don';如果等待更改,请不要重新呈现页面
我使用iron router的waitOn功能订阅了一个集合。此订阅依赖于会话变量。当会话变量更改时,应使用会话变量的新值续订 这很好,但有一个问题:当会话变量更改时,页面会进行完全的重新加载。然而,我只想改变数据 是否有可能避免这种重新登录行为,并在会话变量更改时重新订阅 谢谢,Javascript 铁路由器:Don';如果等待更改,请不要重新呈现页面,javascript,session,meteor,iron-router,Javascript,Session,Meteor,Iron Router,我使用iron router的waitOn功能订阅了一个集合。此订阅依赖于会话变量。当会话变量更改时,应使用会话变量的新值续订 这很好,但有一个问题:当会话变量更改时,页面会进行完全的重新加载。然而,我只想改变数据 是否有可能避免这种重新登录行为,并在会话变量更改时重新订阅 谢谢, 托尼显然,我想要的是不可能的。我找到的解决办法如下: 我没有使用waitOn订阅,而是在Template.rendered回调中订阅Deps.autorun。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,它会导致内部计算重新运行,因为这是一个订阅(使订阅的存在成为反应性的,而订阅本身是非反应性的)。您好,这可能会帮助您感谢您的评论,但这并不能真正解决我遇到的问题