添加方法可在所有视图中使用

时间:2012-03-16 01:03:09

标签: model-view-controller grails metaprogramming

我想在我的应用中为所有视图提供一种方法。

我希望能够像这样打电话:

<span>${ getDynamicText() }</span>

实现这一目标的最明显的方法是:

  1. 调用控制器中的方法,并将其传递给View。
  2. 在某些Util类上使该方法为静态,并从代码${ UtilClass.getDynamicText() }
  3. 中调用它
  4. 使用元编程以某种方式使该方法可用于所有视图。
  5. #3的好处是只需要在一个地方进行更改。必须在每个控制器动作中进行#1;和#2需要在每个想要使用该方法的View页面上导入。

    那么有没有办法添加一种方法供我的应用中的所有视图使用?

    我不得不承认我不太详细地知道.gsp文件是如何在幕后处理的,所以也许它们没有相应的类,因此无法以这种方式进行操作。好文章/文档的链接将获得额外的好事。

4 个答案:

答案 0 :(得分:3)

GSP被编译为扩展org.codehaus.groovy.grails.web.pages.GroovyPage的类,因此您可以向该元类添加方法,并且它们可供所有GSP使用。最好的地方是BootStrap.groovy(或插件doWithDynamicMethods关闭):

import org.codehaus.groovy.grails.web.pages.GroovyPage

class BootStrap {

   def init = { servletContext ->
      GroovyPage.metaClass.getDynamicText = { ... }
   }
}

答案 1 :(得分:2)

在GSP中重用功能的推荐方法是将其定义为标记,例如

class MyTagLib {

  static namespace = 'my'

  def dynamicText = {attrs ->
    out << 'not very dynamic'
  }
}

然后,您可以使用以下命令在GSP中调用此标记:

<my:dynamicText/>

答案 2 :(得分:1)

第4种方法:创建一个具有方法'.getDynamicText'的类/服务,并将其内容放入before过滤器(request.setAttribute('x', myDynamicTextGeneratorObject))的请求中

现在您可以在任何GSP中使用x.dynamicText

答案 3 :(得分:0)

我就是这样做的:

  • 将新类添加到包含方法
  • 的controllers文件夹中
  • 执行grails install-templates
  • 导航到模板:\src\templatesscaffolding
  • 将扩展部分添加到控制器模板:class ${className}Controller extends NewController
  • 重新生成您的控制器

您现在可以在每个类和gsp中使用该方法。