从 NavigableMap 构建菜单
Build Menu from NavigableMap
在 Grails 3.3 应用程序中,我正在尝试创建一个菜单配置,我想为此使用 application.groovy。
application.groovy:
mainmenuconfig {
menuitem_1 {
id = 'menuitem-1'
name='Home'
sub=null
}
menuitem_2 {
id ='menuitem-2'
name='Stammdaten'
sub = submenuitem_2 {
menuitem_2_1 {
id = 'menuitem-2-1'
name ='Stamm-A'
sub=null
}
}}
}
通过 grailsApplication.config.get('mainmenuconfig')
检索配置会得到以下信息:
[menuitem_1:[id:menuitem-1, name:Home, sub:null], menuitem_2:[id:menuitem-2, name:Stammdaten, submenuitem_2:[menuitem_2_1:[id:menuitem-2-1, name:Stamm-A]], sub:null]]
如果我看 getClass()
它说它是 org.grails.config.NavigableMap
现在,根据我的理解,生成 <UL> ... <LI>
树应该在视图层内完成。为了遍历该结构,我需要递归,因为它可以有 n 层深。
如果我从 main.gsp
看,我知道我想插入菜单树的位置,但我如何将数据带到那里以及我在哪里进行递归?我需要一个从 GSP 调用的菜单控制器吗?恕我直言,普惠制不应该做这样的电话。另一方面,任何控制器都不应生成 <UL> ... <LI>
棵树。我需要胶片。
这听起来很适合 interceptor。您可以在每个动作完成后将其添加到您的模型中。然后您的视图将可以访问其模型中的 menu
并可以构建菜单。如果是为了显示目的,在你的视图中进行递归是可以的。
class NavigationMenuInterceptor {
NavigationMenuInterceptor() {
matchAll()
}
boolean after() {
model.menu = grailsApplication.config.getProperty('mainmenuconfig', Map)
true
}
}
要呈现菜单,您可以使用递归呈现自身的模板。根据您想要的 HTML 输出,它可能如下所示。
正文中:
<ul>
<g:each in="${menu}" var="menuitem">
<g:render template="menuitem" model="[menuitem: menuitem]"/>
</g:each>
</ul>
在您的模板中 _menuitem.gsp
:
<li id="${menuitem.id}">
${menuitem.name}
</li>
<g:if test="${menuitem.sub}">
<li>
<ul>
<g:render template="menuitem" model="[menuitem: menuitem.sub]"/>
</ul>
</li>
</g:if>
在 Grails 3.3 应用程序中,我正在尝试创建一个菜单配置,我想为此使用 application.groovy。
application.groovy:
mainmenuconfig {
menuitem_1 {
id = 'menuitem-1'
name='Home'
sub=null
}
menuitem_2 {
id ='menuitem-2'
name='Stammdaten'
sub = submenuitem_2 {
menuitem_2_1 {
id = 'menuitem-2-1'
name ='Stamm-A'
sub=null
}
}}
}
通过 grailsApplication.config.get('mainmenuconfig')
检索配置会得到以下信息:
[menuitem_1:[id:menuitem-1, name:Home, sub:null], menuitem_2:[id:menuitem-2, name:Stammdaten, submenuitem_2:[menuitem_2_1:[id:menuitem-2-1, name:Stamm-A]], sub:null]]
如果我看 getClass()
它说它是 org.grails.config.NavigableMap
现在,根据我的理解,生成 <UL> ... <LI>
树应该在视图层内完成。为了遍历该结构,我需要递归,因为它可以有 n 层深。
如果我从 main.gsp
看,我知道我想插入菜单树的位置,但我如何将数据带到那里以及我在哪里进行递归?我需要一个从 GSP 调用的菜单控制器吗?恕我直言,普惠制不应该做这样的电话。另一方面,任何控制器都不应生成 <UL> ... <LI>
棵树。我需要胶片。
这听起来很适合 interceptor。您可以在每个动作完成后将其添加到您的模型中。然后您的视图将可以访问其模型中的 menu
并可以构建菜单。如果是为了显示目的,在你的视图中进行递归是可以的。
class NavigationMenuInterceptor {
NavigationMenuInterceptor() {
matchAll()
}
boolean after() {
model.menu = grailsApplication.config.getProperty('mainmenuconfig', Map)
true
}
}
要呈现菜单,您可以使用递归呈现自身的模板。根据您想要的 HTML 输出,它可能如下所示。
正文中:
<ul>
<g:each in="${menu}" var="menuitem">
<g:render template="menuitem" model="[menuitem: menuitem]"/>
</g:each>
</ul>
在您的模板中 _menuitem.gsp
:
<li id="${menuitem.id}">
${menuitem.name}
</li>
<g:if test="${menuitem.sub}">
<li>
<ul>
<g:render template="menuitem" model="[menuitem: menuitem.sub]"/>
</ul>
</li>
</g:if>