【问题标题】:Build Menu from NavigableMap从 NavigableMap 构建菜单
【发布时间】:2019-06-23 22:02:34
【问题描述】:

在 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> 树应该在 View 层内完成。为了遍历该结构,我需要递归,因为它可以是 n 级深。

如果我从main.gsp 看,我知道要插入菜单树的位置,但是如何将数据带到那里以及在哪里进行递归?我需要从 GSP 调用的菜单控制器吗?恕我直言,普惠制不应进行此类调用。另一方面,没有控制器应该生成<UL> ... <LI> 树。我需要胶水。

【问题讨论】:

    标签: grails gsp


    【解决方案1】:

    这听起来对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>
    

    【讨论】:

    • 感谢使用拦截器的想法,这似乎正是我所需要的,独立于所有控制器和视图构建菜单。到目前为止,我已经将我的逻辑放入拦截器中,可以生成菜单。到目前为止工作正常,除了一件事:应该在哪里生成带有实际菜单树的 html sn-p?我应该在拦截器中生成它并通过参数将包含 sn-p 的字符串传递给视图吗?就 MVC 分离而言,这有点奇怪。另一方面,我需要递归,这在 GSP 中会有点奇怪。
    • 到目前为止,我确实在拦截器中创建了 html sn-p 的路线。它工作正常,我通过 params 变量将它传递给视图,并且在 GSP 中我必须使用 ${raw(params.menusnippet)} 以原始编码显示它,以便正确呈现 html。至于是否允许在拦截器内部的宗教问题,我已准备好调整解决方案,但现在我很感激能引导我朝着正确的方向前进。谢谢!
    • @Michael 我添加了一些关于递归渲染可能是您正在寻找的模板的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多