我的目标是在Meteor网站上动态创建导航菜单。
我有一个带有静态链接的经典菜单,以及我希望在需要时插入其他链接的产量:
<nav id="menu">
<a href="#link1">Link 1</a>
<a href="#link2">Link 2</a>
{{> yield "navLinks"}}
</nav>
-
// module_posts.js
Router.onAfterAction(function(){
if (userIsAdmin()) {
this.render('postsMenu', { to: 'navLinks' });
}
});
// module_users.js
Router.onAfterAction(function(){
if (userIsAdmin()) {
this.render('usersMenu', { to: 'navLinks' });
}
});
问题是,例如,当连接管理员时,每个模块(帖子,角色,类别......)应该将自己的链接插入到该区域,但会发生的是每个模块都在前一个模块上进行渲染,删除由另一个模块添加的链接,因此该区域似乎只接受一个要呈现的模板。
也许我做错了,所以请给我一个干净的解决方案。
- 编辑 -
好吧,也许更好的解释: 我有几个可以启用或禁用的模块(帖子,用户,角色等),每个模块都有一个导航菜单来管理它。
现在,我想在名为{{nav}}的唯一区域中显示其菜单。 因此,如果模块已启用,我必须在每个模块的某处编写代码以将其菜单附加到{{nav}}区域。
我真的想使用模板来实现这一点,因为我可以直接在其中构建逻辑,而不是使用集合来存储链接。
答案 0 :(得分:0)
您遇到问题的原因是您使用Router.onAfterAction()
功能呈现菜单模板。这样做的问题是Router.onAfterAction()
函数全局应用于所有路由,并在运行新路由时运行。这就是为什么您只看到最终定义的导航链接定义中的导航链接,在上述问题的情况下,这将是usersMenu
导航链接。相反,您希望为每个希望它不同的路径定义导航菜单模板渲染逻辑。此外,您不希望使用onAfterAction()
函数,因为一旦您的路线实际运行,这将用于后处理。为了实现您的目标,您将执行以下操作:
Router.route('/admin/posts', {
...
yieldRegions: {
'postsMenu': {to: 'navLinks'}
}
...
});
Router.route('/admin/users', {
...
yieldRegions: {
'usersMenu': {to: 'navLinks'}
}
...
});
因此,正如您所看到的,我们已经为您的问题中指定的每个独特路线定义了路线定义,一个用于管理员帖子,另一个用于管理员用户。为了指定要为给定路由呈现为命名yield
的特定模板,您应该使用yieldRegions
路由选项。在其中,您可以指定要在哪个命名的yield区域中呈现的每个模板的名称。您可以在此处根据问题指定模板。
如果您想了解定义路线定义时可用的所有路线特定选项,请查看here。