重用部分Grails标准关闭

时间:2013-11-25 13:19:58

标签: grails groovy closures

我的Grails应用程序中有一个相当大的条件闭包,我想在我的应用程序中的几个地方重用它的一部分。我不想复制我需要重用的部分,而是将其定义为一个单独的闭包,并在需要的地方引用它,但我在语法上有点挣扎。

这是一个简化/缩减版本,但基本上我的标准看起来像这样:

def criteriaClosure = {
    and {
        // filtering criteria that I'd like to reuse in lots of places
        or {
            names.each { name ->
                sqlRestriction(getFilteringSql(name), [someId])
            }
        }

        if (isOrganisationChild(childDefaultGrailsDomainClass)) {
            sqlRestriction(getFilteringSql(domain), [someArg])
        }

        // filtering criteria that's specific to this particular method
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    }
}

def criteria = domain.createCriteria()
def paginatedList = criteria.list([offset: offset, max: max], criteriaClosure)

我已经尝试定义我想要作为变量重用的闭包部分,并在我的标准闭包中引用它,但是它定义的限制似乎并未应用。

def reusableClosure = {
    and {
        or {
            names.each { name ->
                sqlRestriction(getFilteringSql(name), [someId])
            }
        }

        if (isOrganisationChild(childDefaultGrailsDomainClass)) {
            sqlRestriction(getFilteringSql(domain), [someArg])
        }
    }
}

def criteriaClosure = {
    and {
        reusableClosure() //this doesn't seem to work
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    }
}

我相信这一定是一件非常简单的事情,如果这是一个愚蠢的问题,请道歉。有什么想法吗?

1 个答案:

答案 0 :(得分:13)

我认为你必须将代表传递给reusableClosure,即:

def criteriaClosure = {
    and {
        reusableClosure.delegate = delegate
        reusableClosure()
        sqlRestriction(getSomeOtherSql(), [someOtherArg])
    }
}