假设我有一个名为Navbar
的模板,该模板包含在Main
和About
页面中。在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)
。
答案 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')