重用 Grails 标准闭包的一部分
Posted
技术标签:
【中文标题】重用 Grails 标准闭包的一部分【英文标题】:Reusing part of Grails criteria closure 【发布时间】: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])
我确信这一定是一件非常简单的事情,所以如果这是一个愚蠢的问题,我深表歉意。有什么想法吗?
【问题讨论】:
【参考方案1】:我认为您必须将委托传递给reusableClosure
,即:
def criteriaClosure =
and
reusableClosure.delegate = delegate
reusableClosure()
sqlRestriction(getSomeOtherSql(), [someOtherArg])
【讨论】:
成功了,谢谢。 - 顺便说一句,为什么'reusableClosure'后面的括号是必要的? 酷 :-) 因为这会调用闭包(它将and
块返回到 Criteria)以上是关于重用 Grails 标准闭包的一部分的主要内容,如果未能解决你的问题,请参考以下文章