在Grails自定义标记库中查找父标记

在Grails自定义标记库中查找父标记,grails,groovy,gsp,taglib,Grails,Groovy,Gsp,Taglib,我正在Grails中开发自定义标记库,它应该知道父标记。所以如果我在普惠制中有这样的东西: <a href="#"> <my:tag blabla="blabla"/> </a> 那么my:标记的实现应该能够发现它被封装在标记“a”中,而不是其他东西。 那么这是否可能: 1.找出哪个标签是父标签? 2.更改父标记属性?编辑-此处的答案不能回答所问的问题。有关说明,请参见注释。我将把答案留在这里,因为删除它会使所有其他评论都无法理解,但这里的答案并不是

我正在Grails中开发自定义标记库,它应该知道父标记。所以如果我在普惠制中有这样的东西:

<a href="#">
  <my:tag blabla="blabla"/>
</a>

那么my:标记的实现应该能够发现它被封装在标记“a”中,而不是其他东西。
那么这是否可能:
1.找出哪个标签是父标签?

2.更改父标记属性?

编辑-此处的答案不能回答所问的问题。有关说明,请参见注释。我将把答案留在这里,因为删除它会使所有其他评论都无法理解,但这里的答案并不是对所问问题的有效答案。很抱歉弄出了噪音。

没有一种改变父标记属性的好方法,但这也不是一个好主意。几乎可以肯定的是,有一种更好的方式来完成让你想做的事情。然而,想要知道一个标记是否嵌套在另一个特定的标记中是一件非常合理的事情,并且有简单的方法可以做到这一点。一种方法是,父标记可以在
pageScope
中存储一些状态,子标记可以查询该值以确定它是否在父标记内部被调用。您可以只使用布尔标志,但如果您关心多个嵌套级别,那么这将是一个问题。计数器可以跟踪任意深度

像下面这样的方法应该可以奏效

标记库:

// grails-app/taglib/demo/DemoTagLib.groovy
package demo

class DemoTagLib {

    static namespace = 'demo'

    def someParentTag = { attrs, body ->
        def depthCounter = pageScope.someParentTagDepthCounter ?: 0
        pageScope.someParentTagDepthCounter = ++depthCounter

        out << body()

        pageScope.someParentTagDepthCounter = --depthCounter
    }

    def someChildTag = { attrs, body ->
        // This tag will only render its body if the tag invocation
        // is nested inside of a someParentTag parent.  This just
        // demonstrates one way that a tag can discover if it is
        // nested inside of some other specific tag.
        if(pageScope.someParentTagDepthCounter) {
            out << body()
        }
    }
}
//grails-app/taglib/demo/demoaglib.groovy
软件包演示
亚格列本类{
静态命名空间='demo'
def someParentTag={attrs,body->
def depthCounter=pageScope.someParentTagDepthCounter?:0
pageScope.someParentTagDepthCounter=++depthCounter
出来
//只有在标记调用
//嵌套在someParentTag父对象中。这只是
//演示了一种标记可以发现是否存在的方法
//嵌套在其他特定标记的内部。
if(pageScope.someParentTagDepthCounter){

这是不可能的(没有真正丑陋和复杂的黑客)“这是不可能的(没有真正丑陋和复杂的黑客)”-@IgorArtamonov我不同意这一点。这样做不需要黑客。你可以用一个简单的方法,使用堆栈计数器来跟踪标记何时嵌套在其他标记中。请参阅下面的我的答案。请参阅下面的@IgorArtamonov对我的答案的评论。我得到了更正。我误读了这个问题。我以为你想跟踪标记何时嵌套在其他标记中P标记嵌套在另一个GSP标记中。问题不是这样说的。我的错误,我为噪音道歉。但问题是关于标记,而不是自定义。你如何将这种方法应用于其他html标记?我明白了。你确实是对的。我站着更正。你仍然可以通过拥有自己的标记来生成锚标记,但这不是问题的重点,抱歉吵闹。
// src/test/groovy/demo/DemoTagLibSpec.groovy
package demo

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(DemoTagLib)
class DemoTagLibSpec extends Specification {

    void "test something"() {
        expect: 'when someChildTag is not wrapped in someParentTag then the someChildTag body is not rendered'
        applyTemplate('Heading <demo:someChildTag>Body</demo:someChildTag>') == 'Heading '

        and: 'when someChildTag is wrapped in someParentTag then the someChildTag body is rendered'
        applyTemplate('Heading <demo:someParentTag><demo:someChildTag>Body</demo:someChildTag></demo:someParentTag>') == 'Heading Body'

        and: 'when multiple someChildTags are nested in multiple levels of someParentTags, their bodies are rendered'
        applyTemplate('Heading <demo:someParentTag><demo:someChildTag>First Child<demo:someParentTag> <demo:someChildTag>Second Child</demo:someChildTag></demo:someParentTag></demo:someChildTag></demo:someParentTag>') == 'Heading First Child Second Child'
    }
}