Не удается вызвать сам метод в grails

#grails #groovy #gsp

#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.....
  

Кто-нибудь может это исправить?

Ответ №1:

Я поместил свой код в gsp.

Вам действительно следует поместить такой код в taglib.

Кто-нибудь может это исправить?

Если это просто стандартный рекурсивный метод, то очевидный способ выполнить рекурсивный вызов -:

 createMenuChild(child1MenuInstance,paramMenuArr)
  

Попробуйте использовать это вместо

 owner.call (child1MenuInstance,paramMenuArr)
  

Комментарии:

1. Я все еще не могу этого сделать. Он всегда становится неправильным …. и ошибка по-прежнему, как и раньше .. : (

Ответ №2:

вы используете закрытие, которое не является распространенным методом. смотрите: http://groovy.codehaus.org/Closures

ownler.call означает, что вы хотите вызвать метод с именем «call» владельца (класса) замыкания. возможно, вы можете исправить это, заменив owner.call на createMenuChild (child1MenuInstance,paramMenuArr). это вызвало бы закрытие с заданными параметрами.

Комментарии:

1. Я все еще не могу этого сделать. Он всегда становится неправильным …. и ошибка по-прежнему, как и раньше .. : (

2. пожалуйста, опубликуйте точное сообщение об исключении или всю трассировку стека.

Ответ №3:

Хитрость здесь в том, чтобы предварительно определить имя закрытия перед его назначением.

 def createMenuChild
createMenuChild = {...}
  

вместо

 def createMenuChild = createMenuChild = {...}
  

Тогда вы сможете ссылаться на закрытие вместо вызова owner.call.