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