自动重新渲染:对反应性的混淆

时间:2015-04-18 17:19:54

标签: meteor

假设我有一个名为Navbar的模板,该模板包含在MainAbout页面中。在Navbar模板中,我有一个搜索栏组件,我只想在Main模板上显示。我定义了一个如下所示的辅助函数:

Template.Navbar.helpers({
  'isMain': function() {
     return location.pathname == '/';
  }
})

在navbar.html中,

{{#if isMain}}
  <div class="search">search</div>
{{/if}}

只要您刷新页面,这就很有效。这是因为在主页面上,Navbar模板已经呈现,当您转到About页面时,它无法重新呈现。作为一种解决方法,我正在考虑将辅助函数包含在Template.autorun

问:这里究竟发生了什么以及处理此类问题的传统方式是什么?我每次去主页时都在想Session.set("isMain", true)

2 个答案:

答案 0 :(得分:3)

您的isMain模板帮助程序不是被动的,因为它不依赖于任何被动数据源(查询位置对象,这是非反应性的)。

如果您正在使用iron:router,则可以执行以下操作:

Template.Navbar.helpers({
  'isMain': function() {
     return Router.current().route.getName() == 'main';
  }
});

鉴于您已宣布主要路线如下:

Router.route("/", {
  name: "main",
  [...]
});

如果您未使用iron:router,则必须依赖其他内容,例如Session变量来跟踪网页更改并相应地设置其值。

答案 1 :(得分:0)

正如@saimeunt建议的那样,我使用Iron Router解决了这个问题。

  Template.Nav.helpers({
    'isMainPage': function(e, template) {
      return (Router.current().location.get().path == '/');
    }
  })

语法略有不同,但这可行,因为Router作为反应来源,但location.pathname不会使isMainPage助手反应。

每次导航到主页面或从主页面导航时,也可以设置Session.set('isMain', true/false),帮助程序返回Session.get('isMain')