【问题标题】:Reusing part of Grails criteria closure重用 Grails 标准闭包的一部分
【发布时间】:2013-12-10 05:48:27
【问题描述】:

我的 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])
    }
}

我确信这一定是一件非常简单的事情,所以如果这是一个愚蠢的问题,我深表歉意。有什么想法吗?

【问题讨论】:

    标签: grails groovy closures


    【解决方案1】:

    我认为您必须将委托传递给reusableClosure,即:

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

    【讨论】:

    • 成功了,谢谢。 - 顺便说一句,为什么'reusableClosure'后面的括号是必要的?
    • 酷 :-) 因为这会调用闭包(它将 and 块返回到 Criteria)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2015-01-02
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多