代码之家  ›  专栏  ›  技术社区  ›  Stefan Kendall

从模板中管理标题导航菜单的最佳方法?

  •  2
  • Stefan Kendall  · 技术社区  · 14 年前

    我想把导航放在我的GSP模板中,我想设置 active 在每个页面的导航元素上初始化。最好的方法是什么?我有几个 .gsp 视图与如下所示的单个模板合并:

      <div id="bd" role="main">
        <div role="navigation" class="yui-g">
          <ul id="nav"><a href="index.gsp"><li class="active">Home</li></a><a href = "products.gsp"><li>Products</li></a><a href = "contacts.gsp"><li>Contact</li></a></ul>
        </div>
        <g:layoutBody/>
      </div>
    
    5 回复  |  直到 12 年前
        1
  •  1
  •   wwwclaes    14 年前

    我喜欢阿曼迪诺的建议,但是如果你不是通过点击菜单(如通过书签或登录后的第一页)来访问页面,你可能会遇到问题。

    如果您使用的是SiteMesh,这是另一个解决方案,但是它并不孤立于菜单模板,因此在设计上也不是很好:

    Grails active page navigation menu

        2
  •  3
  •   Fletch    12 年前

    您可以使用一些本机存在的参数,而不是传递参数:

    <g:set var="pageId" value="${params.controller}-${params.action}"/>
    

    然后在导航项上

    <g:if test="${pageId == 'book-list'}"> class="active"</g:if>
    
        3
  •  2
  •   armandino    14 年前

    这通常是通过传递参数来完成的,我们称之为 activeView . 然后,在菜单模板中,可以根据参数值检查要突出显示的菜单项:

    <g:if test="${activeView == 'products'}">
       <li class="menuItem active">Products</li><!-- not clickable if active -->
    </g:if>
    <g:else>
       <li class="menuItem"><a href="products.gsp?activeView=products">Products</a></li>
    </g:else>
    

    我也建议 controllers as the point of entry 而不是GSP。

      <g:link controller="products" action="list" class="menuItem" params="[activeView:'products']">Book List</g:link>
    
        4
  •  1
  •   Stefan Armbruster    14 年前

    另一个想法是使用 Grails navigation plugin .

        5
  •  0
  •   barrymac    12 年前

    我认为SiteMesh PageProperty是一种优雅的无创解决方案,它可以将事物完全保存在视图中。

    在特定页面中:

    <body active="home">
    

    在SiteMesh布局模板中:

    <g:if test="${pageProperty(name: 'body.active') == 'home'}">
        <li class="active"><g:link uri="/">Home</g:link></li>
    </g:if>
    <g:else>
        <li><g:link uri="/">Home</g:link></li>
    </g:else>