【问题标题】:Is possible to overwrite the behaviour of the methods **CreateLink** and **CreateLinkTo**?是否可以覆盖方法 **CreateLink** 和 **CreateLinkTo** 的行为?
【发布时间】:2012-08-14 02:36:23
【问题描述】:

是否可以覆盖 CreateLink 和 CreateLinkTo 方法的行为?

【问题讨论】:

  • 您希望覆盖什么行为?
  • 我想为生成的链接添加前缀。我可以编写一个 HTMLCodec 方法来解决我的部分问题,该方法将返回带有前缀的 href。不幸的是,对于使用属性 SRC 的标签,情况并非如此。据我所知,这个 SRC 是使用 CreateLink 或 CreateLinkTo 生成的。有可能有这种行为吗?

标签: grails


【解决方案1】:

您可以使用元编程来替换 ApplicationTaglib 上的闭包。

ApplicationTagLib.metaClass.getCreateLink = {->
  return {attrs->
         // your code here
  }
}

我从未尝试过,但它可能会起作用:)

【讨论】:

    【解决方案2】:

    您需要做的就是创建自己的标签库并自己定义标签,即

    class MyTabLib {
      def createLink = {attrs, body ->
       .... etc ....
      }
    
      def createLinkTo = {attrs, body ->
       .... etc ....
      }
    
    }
    

    Grails 将首先使用您的 taglib。

    希望对您有所帮助!

    【讨论】:

    • 感谢您的回答。您能否指定如何在此标签 lig 中调用原始 createLink。我只需要修改生成的链接只添加一个前缀。 (+1)
    • 你应该能够执行类似 def createLink = {attrs, body -> def apptag = new ApplicationTagLib() out
    【解决方案3】:

    这有点晚了,但上面的解决方案对我不起作用。不过,我能够成功地做到这一点:

    public class MyTagLib extends ApplicationTagLib {
    
      def oldResource
    
      public MyTagLib() {
        // save the old 'resource' value
        oldResource = resource;
        resource = staticResource;
      }
    
      def staticResource = { attrs ->
        // dork with whatever you want here ...
        // ...
        out << oldResource(attrs);
     }
    }
    

    您基本上是在扩展原始标签库。由于“资源”标签是对象的属性(而不是方法),我认为您实际上不能覆盖它。相反,只需保存原始值并在对标记请求进行更改后调用它。

    【讨论】:

    • 哦..我覆盖了'resource'标签,但这对于'createLink'或'createLinkTo'(已弃用的'resource'标签)应该同样有效
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多