使用 Meteor 和 Iron Router 创建活动导航状态
Creating active navigation state with Meteor and Iron Router
我想将 'active' 的 class 添加到 Iron Router 当前正在呈现的导航列表项中。
这是我的标记:
<ul>
<li>
{{#linkTo route="option1"}}
<span class="fa fa-fw fa-option"></span>
Option 1
{{/linkTo}}
</li><li>
{{#linkTo route="option2"}}
<span class="fa fa-fw fa-option"></span>
Option 2
{{/linkTo}}
</li>
</ul>
我已经通读了该指南和各种文章,但在任何地方都找不到这方面的内容。假设我需要某种帮手?
我认为您可能会发现 meteor-iron-router-active 很有用,因为它有以下帮助程序:
- isActiveRoute
- isActivePath
这是我的做法。
首先,我 运行 这个 (CoffeeScript) 当我设置 iron router 时:
Router.onAfterAction(() ->
Session.set('active', @route.getName())
)
然后,对于我在导航栏中向新页面显示 link 的每个位置,我的 html(在我的例子中为 jade)如下所示:
a(href=path class=isActive)
最后,具有此类 link 的任何模板的助手(同样是 CoffeeScript)具有以下内容:
Template.navElement.helpers(
isActive: () ->
if this.name is Session.get('active')
return "active"
else
return ""
)
注意,如果 this.name
不起作用,请尝试:Router.current().route.getName()
----- 此行下方的可选额外内容 -----
这不是满足您的要求所必需的,但我使用单个递归调用的模板对导航进行数据驱动,因此上面的代码只在我的代码中出现一次,但我从几个不同的地方引用了 navElement 模板。完全干燥。这是我的两级深度受限示例(同样是 Jade):
template(name="navElement")
li
a(href=path class=isActive)
if icon
i.fa.fa-fw(class=icon)
| #{label}
if children
span.fa.arrow
if children
ul.nav.nav-second-level
each children
+navElement
在我的侧边栏或顶部栏中调用它的地方如下所示:
each navElements
+navElement
有了这个帮手:
Template.sidebar.helpers(
navElements: () ->
return Session.get('navRoots')
)
我最初设置并根据用户的操作不时更改,navRoots 会话变量是这样的:
navRoots = [
{icon:"fa-gear", label:"Menu item 1", children: [
{label: "Sub menu item 1.a"},
{label: "Sub menu item 1.b"}
},
{label: "Menu item 2"}
]
Session.set('navRoots', navRoots)
每个用户都可以配置 his/her 自己的边栏菜单。注销的用户只有一个选项(登录)。等等。完全数据控制。
我想将 'active' 的 class 添加到 Iron Router 当前正在呈现的导航列表项中。
这是我的标记:
<ul>
<li>
{{#linkTo route="option1"}}
<span class="fa fa-fw fa-option"></span>
Option 1
{{/linkTo}}
</li><li>
{{#linkTo route="option2"}}
<span class="fa fa-fw fa-option"></span>
Option 2
{{/linkTo}}
</li>
</ul>
我已经通读了该指南和各种文章,但在任何地方都找不到这方面的内容。假设我需要某种帮手?
我认为您可能会发现 meteor-iron-router-active 很有用,因为它有以下帮助程序:
- isActiveRoute
- isActivePath
这是我的做法。
首先,我 运行 这个 (CoffeeScript) 当我设置 iron router 时:
Router.onAfterAction(() ->
Session.set('active', @route.getName())
)
然后,对于我在导航栏中向新页面显示 link 的每个位置,我的 html(在我的例子中为 jade)如下所示:
a(href=path class=isActive)
最后,具有此类 link 的任何模板的助手(同样是 CoffeeScript)具有以下内容:
Template.navElement.helpers(
isActive: () ->
if this.name is Session.get('active')
return "active"
else
return ""
)
注意,如果 this.name
不起作用,请尝试:Router.current().route.getName()
----- 此行下方的可选额外内容 -----
这不是满足您的要求所必需的,但我使用单个递归调用的模板对导航进行数据驱动,因此上面的代码只在我的代码中出现一次,但我从几个不同的地方引用了 navElement 模板。完全干燥。这是我的两级深度受限示例(同样是 Jade):
template(name="navElement")
li
a(href=path class=isActive)
if icon
i.fa.fa-fw(class=icon)
| #{label}
if children
span.fa.arrow
if children
ul.nav.nav-second-level
each children
+navElement
在我的侧边栏或顶部栏中调用它的地方如下所示:
each navElements
+navElement
有了这个帮手:
Template.sidebar.helpers(
navElements: () ->
return Session.get('navRoots')
)
我最初设置并根据用户的操作不时更改,navRoots 会话变量是这样的:
navRoots = [
{icon:"fa-gear", label:"Menu item 1", children: [
{label: "Sub menu item 1.a"},
{label: "Sub menu item 1.b"}
},
{label: "Menu item 2"}
]
Session.set('navRoots', navRoots)
每个用户都可以配置 his/her 自己的边栏菜单。注销的用户只有一个选项(登录)。等等。完全数据控制。