【问题标题】:Add method to be available in all Views添加方法在所有视图中可用
【发布时间】:2012-03-16 20:26:52
【问题描述】:

我希望我的应用程序中的所有视图都可以使用一种方法。

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

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

(对我而言)最明显的实现方式是:

  1. 调用控制器中的方法并将其传递给视图。
  2. 在某个 Util 类上将方法设为静态并从代码${ UtilClass.getDynamicText() } 中调用它
  3. 使用元编程以某种方式使该方法可用于所有视图。

#3 的好处是只需在一个地方进行更改。 #1 必须在每个控制器动作中进行; #2 需要在每个想要使用该方法的视图页面上导入。

那么有没有办法添加一个可用于我的应用中所有视图的方法?

我不得不承认,我并不太了解 .gsp 文件是如何在幕后处理的,因此它们可能没有相应的类,因此无法以这种方式进行操作。好的文章/文档的链接将获得额外的好业力。

【问题讨论】:

标签: model-view-controller grails metaprogramming


【解决方案1】:

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 = { ... }
   }
}

【讨论】:

    【解决方案2】:

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

    class MyTagLib {
    
      static namespace = 'my'
    
      def dynamicText = {attrs ->
        out << 'not very dynamic'
      }
    }
    

    然后您可以使用以下方法在 GSP 中调用此标记:

    <my:dynamicText/>
    

    【讨论】:

    • 是的,这对于许多情况来说无疑是一个整洁的解决方案。一个限制是如果我想做这样的事情&lt;g:someTag key: "${ /* I can use metaClass property or method here, can't use a tag */ }" key2: 'b' /&gt;。但这可能建议将属性/方法移动到更合适的位置。
    • @David 我不明白你所指的限制。也许你可以用更详细的解释来更新你的问题
    • 不,没关系。这是一个相当人为的例子,实际上很容易解决。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我会这样做:

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

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

      【讨论】:

      • 我看到了这种为控制器创建公共超类的方法如何使所有控制器都可以使用方法/属性。但它是如何在 gsps 中可用的呢?
      猜你喜欢
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      相关资源
      最近更新 更多