【问题标题】:Grails & Navigation Plugin: Rendering SubItems from different controllers?Grails & Navigation Plugin:渲染来自不同控制器的子项?
【发布时间】:2011-03-04 19:14:28
【问题描述】:

我正在使用 Grails 1.1 和导航插件 1.0.4,但遇到了问题。我想让来自 3 个不同控制器的操作作为子项贡献给来自不同控制器的菜单。

我看到的所有示例都使用主菜单和子项指向同一控制器内的操作的基本情况。

我尝试使用一个完全分离的控制器,只是为了在那里标记导航,对子项使用重定向(见下文)。但在这种情况下,子项就不会呈现。

class ResourceNavController {

// Navigation
static navigation = [ group:'modules', order:100, title:'Test', action:'listResources',
    subitems: [
        [group:'modules', order:10, title:'Resources', action:'listResources'],
        [group:'modules', order:20, title:'Environments', action:'listEnvironments'],
        [group:'modules', order:30, title:'Settings', action:'listSettings']
    ]
]

def listResources = {
    redirect(controller:"resource",action:"list")
}

def listEnvironments = {
    redirect(controller:"environment",action:"list")
}

def listSettings = {
    redirect(controller:"setting",action:"list")
}

}

有什么线索吗?

谢谢, 罗洛

【问题讨论】:

  • 你有没有让这个工作?我被困在同一件事上。
  • 嗨,布拉德 答案是否定的。我实际上不再使用该插件。
  • 希望我早点看到这个问题。我们尝试使用该插件,最后也实现了我们自己的导航。

标签: grails


【解决方案1】:

您是否尝试按照文档中的说明在 Config.groovy 中使用显式控制器属性注册导航信息? (请参阅“或者,在 Config.groovy 中添加项目”1

部分

它可能有效,但我认为它不会正确突出“活动”项目。真的,这永远不会很好地工作,你所做的与基于“约定”的设置不兼容。

导航插件 2.0(还没有 ETA)将有一个不同的基于非控制器的机制来检测当前活动的菜单项,这在这种情况下可能会更好地工作。

您可以随时直接向我(插件的作者)发送电子邮件。

【讨论】:

    【解决方案2】:

    好的,有另一个解决方法...

    改变

    def eachSubItem = { attrs, body ->
    ...
       searchKey = GrailsClassUtils.getLogicalName(controllerName, 'Controller')
    ...
    }
    

    def eachSubItem = { attrs, body ->
    ...
       searchKey = flash.prevcon ?: GrailsClassUtils.getLogicalName(controllerName, 'Controller')
    ...
    }
    

    并添加到所有重定向/转发调用“flash.prevcon = controllerName”

    class ResourceNavController {
    
    // Navigation
    static navigation = [ group:'modules', order:100, title:'Test', action:'listResources',
            subitems: [
                    [group:'modules', order:10, title:'Resources', action:'listResources'],
                    [group:'modules', order:20, title:'Environments', action:'listEnvironments'],
                    [group:'modules', order:30, title:'Settings', action:'listSettings']
            ]
    ]
    
    def listResources = {
            flash.prevcon = controllerName
            redirect(controller:"resource",action:"list")
    }
    
    def listEnvironments = {
            flash.prevcon = controllerName
            redirect(controller:"environment",action:"list")
    }
    
    def listSettings = {
            flash.prevcon = controllerName
            redirect(controller:"setting",action:"list")
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      您的 gsp 是什么样的? ...即:


      【讨论】:

        【解决方案4】:

        解决了我的问题!!!!

        我不知道这是否是最好的解决方案,但对我来说它就像一个魅力......如果我得到更好的解决方案,我会告诉你......

        从 NavigationTagLib.groovy 更改

        def eachSubItem = { attrs, body ->
        ...
           searchKey = GrailsClassUtils.getLogicalName(controllerName, 'Controller')
        ...
        }
        

        def eachSubItem = { attrs, body ->
        ...
           searchKey = GrailsClassUtils.getLogicalName(controllerName, 'Controller').split(/[A-Z]/)[0]
        ...
        }
        

        约定是(为此将示例更改为):

        class ResourcenavController {
        
        // Navigation
        static navigation = [ group:'modules', order:100, title:'Test', action:'listResources',
                subitems: [
                        [group:'modules', order:10, title:'Resources', action:'listResources'],
                        [group:'modules', order:20, title:'Environments', action:'listEnvironments'],
                        [group:'modules', order:30, title:'Settings', action:'listSettings']
                ]
        ]
        
        def listResources = {
                redirect(controller:"resourcenavResource",action:"list")
        }
        
        def listEnvironments = {
                redirect(controller:"resourcenavEnvironment",action:"list")
        }
        
        def listSettings = {
                redirect(controller:"resourcenavSetting",action:"list")
        }
        
        }
        

        grails 版本:1.3.4 导航版本:1.1.1


        嗨,

        首先感谢您迄今为止所做的出色工作。

        问题有解决办法吗?

        我刚刚从 grails 1.2.1 升级到 1.3.4 并遇到了这个问题,1.2.1 没有这个问题(为什么到目前为止还没有调试过)。

        谢谢

        【讨论】:

          【解决方案5】:

          解决这个问题最简单的方法是编辑 NavigationService.groovy 并更改第 62 行:

          这个

          result.controller = p.controller
          

          进入

          result.controller = subitem.controller ? subitem.controller : p.controller
          

          您可以在导航参数中设置控制器参数,如下所示:

          static navigation = [
              group: 'tabs',
              order: 1,
              title: 'Title',
              subItems: [
                      [action: 'list', title: 'Title 1'],
                      [action: 'anotherList', title: 'Another title'],
                      [controller: 'someOtherController', action: 'list', title: 'Last title'],
              ],
          ]
          

          【讨论】:

            猜你喜欢
            • 2012-02-28
            • 2011-03-10
            • 2015-10-19
            • 1970-01-01
            • 1970-01-01
            • 2012-09-13
            • 1970-01-01
            • 2014-05-01
            • 2012-01-06
            相关资源
            最近更新 更多