无法在grails中调用方法本身

时间:2011-05-25 10:00:04

标签: grails groovy gsp

当我尝试在方法体内调用方法时,我的项目出错了。我把代码放在gsp中。

这里是

/* Method for appending the child menu */
def createMenuChild = { obj , paramMenuArr ->
  def urlChildMenu=obj.menu.url
  def idChildMenu=obj.menu.id
  def nameChildMenu=obj.menu.name

  out << '<div><a href="'+urlChildMenu+'" class="mChld">'<< nameChildMenu<< '</div>'

  def childInstance1= Menu.findById(idChildMenu)
  def child1MenuInstance= Menu.createCriteria().list{
    eq("parentMenu",childInstance1)
    order("sequence", "asc")
  }                                     
  if (child1MenuInstance){
    child1MenuInstance.each {newIt5 ->
      def idChildMenu2=newIt5.id
      paramMenuArr.each { newIt6 -> 
        if (newIt6.menu.id == idChildMenu2){
          owner.call (child1MenuInstance,paramMenuArr)
        }
      }
    }       
  }
}

我使用 owner.call 来调用方法本身。我收到了这样的错误

Exception Message: No signature of method: bla.....

任何人都可以解决它?

3 个答案:

答案 0 :(得分:3)

  

我把代码放在gsp中。

你应该把这种代码放在taglib中。

  

任何人都可以解决它?

如果这只是一个标准的递归方法,那么执行递归调用的明显方法是:

createMenuChild(child1MenuInstance,paramMenuArr)

尝试使用此代替

owner.call (child1MenuInstance,paramMenuArr)

答案 1 :(得分:2)

你使用的是闭包而不是常用的方法。见:http://groovy.codehaus.org/Closures

ownler.call意味着您要调用闭包所有者(类)的名为“call”的方法。你可以通过createMenuChild(child1MenuInstance,paramMenuArr)替换owner.call来修复它。这将用给定的参数调用闭包。

答案 2 :(得分:1)

这里的技巧是在分配之前预先定义闭包名称。

def createMenuChild
createMenuChild = {...}

而不是

def createMenuChild = createMenuChild = {...}

然后你将能够引用闭包而不是调用owner.call。