如何在Grails中触发子视图

时间:2011-04-09 21:04:54

标签: grails

有一个问题是不知道哪个是触发grails中各种模板的最佳方法。 我正在尝试对菜单进行硬编码,但仍然针对不同的区域设置了不同的菜单。我个人发现在数据库上构建菜单是一种浪费的运行查询。

快速浏览代码段和方案。 subnav是动态菜单。

<body>
  <div id='navigation'>
    Main menu list
  </div>
  <div id='subnav'>
    Render grails template base on path
    e.g. http://www.example.com/cars/ford => render ${ford} menu template
         http://www.example.com/cars/toyota => render ${toyota} menu template
  </div>
</body>

现在渲染模板很容易,因为我可以使用一个跟随模板名称的变量。例如<g:render template="/layouts/${submenu-name}"/>

我不确定的是设置此变量的最佳方法是什么。 (善恶行为)

我是否在url / uri中使用过滤器并调整以获取我的位置?或者在需要时每次都在控制器中设置它还是使用我没想过的东西?

由于

  

修改

不确定这是不是最好的做法,但是假设我有一个“汽车模板”和“摩托车模板”,那么我只是使用过滤器在视图到达之前更改模型。

E.g。

def filters = {
car(uri:'/car/*') {
    after = { model -> model.menuTpl = 'car' }
}
bike(uri:'/bike/*') {
    after = { model -> model.menuTpl = 'bike' }
}

然后在主视图中:

<g:render template="/layouts/${menuTpl}" />

1 个答案:

答案 0 :(得分:2)

我没有看到有关您的过滤器选项的任何“邪恶”。但仅仅是为了给出选项,这就是我在我的一个项目中所做的事情。

在我的布局中,正文中有一个标题部分,其中包含一个穿过页面的样式栏。此栏包含“登录”,“仪表板”,“支持”等标题。因此,在我的login.gsp中,我有以下内容:

<meta name="nav" content="login"/>

在我的main.gsp布局中,我有以下内容:

<g:if test="${pageProperty(name:'meta.nav') == 'login'}">
   <ul id="menu">
      <li>Login</li>
   </ul>
</g:if>

我有几个块检查meta.nav。他们中的一些甚至不仅仅是文本。有些人会提供模板。