2009-10-28 68 views
2

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

+0

你想重写什么行为? – 2009-10-28 18:05:12

+0

我想为生成的链接添加一个前缀。我可以解决我的一部分问题,编写一个方法HTMLCodec,它将返回带有前缀的href。不幸的是,使用属性SRC的标签并非如此。据我所见,这个SRC是使用CreateLink或CreateLinkTo生成的。有可能有这种行为? – Luixv 2009-10-28 18:29:02

回答

2

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

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

我从来没有尝试过,但它可能工作:)

1

所有你需要做的就是创建一个属于自己的标签库和自己定义的,即

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

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

} 

Grails将标签首先使用你的taglib。

希望这有助于!

+0

谢谢你的回答。你能指定如何在这个标签lig内调用原始的createLink。我只需要修改生成的链接只添加一个前缀。 (+1) – Luixv 2009-10-29 06:05:26

+0

你应该可以做类似 def createLink = {attrs,body - > def apptag = new ApplicationTagLib() out << prefix; out << apptag.createLink(attrs,body); } – 2009-10-29 22:41:45

1

这有点晚了,但上面的解决方案并不适合我。我能够成功地做到这一点,但:

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); 
} 
} 

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

+0

哦..我重写了'resource'标签,但是这对'createLink'或'createLinkTo'(已弃用的'resource'标签) – 2010-03-03 22:03:47