Рекурсивные блоки в шаблонах Scala Play Framework
Я пишу шаблон для блога, в котором есть комментарии. Естественный способ написания шаблона для многопоточных комментариев - использование рекурсивного способа создания HTML. Что-то вроде этого:
@showComment(comment: models.Comment) = {
<div class="comment">
<div class="comment-metadata">
<span class="comment-author">by @comment.author,</span>
<span class="comment-date">
@comment.postedAt.format("dd MMM yy")
</span>
</div>
<div class="comment-content">
<div class="about">Detail: </div>
@Html(comment.content.replace("\n", "<br>"))
</div>
<a href="@action(controllers.Application.replyComment(comment.id()))">Reply</a>
@comments filter { c => c.parent_id == comment.id } map {
c => @showComment(c)
}
</div>
}
Проблема в том, что использование рекурсивного блока приводит к ошибке:
Возникла ошибка: рекурсивный метод showComment нуждается в типе результата
Если я пытаюсь поместить тип возвращаемого значения в showComment, это вызывает ошибку:
Возникла ошибка: не найдено: значение showComment
Любое решение?
3 ответа
Это работает для меня:
Вложите код в @{}
@{
//use regular scala here:
def showComment(comment: models.Comment):Node = {
....
}
//the above just declared a recursive method, now call it:
showComment(...)
}
- определить рекурсивный метод
- вызвать метод в конце блока
- прибыль!
Я смог обойти это, переместив рекурсивный шаблон в собственный файл.
В Scala рекурсивный метод требует возвращаемый тип: см. Почему Scala требует возвращаемый тип для рекурсивных функций?
Я не знаю много (больше как ничего) о Play Framework, но попробую:
@showComment(comment: models.Comment):Node = {
<div class="comment">
<div class="comment-metadata">
<span class="comment-author">by @comment.author,</span>
<span class="comment-date">
@comment.postedAt.format("dd MMM yy")
</span>
</div>
<div class="comment-content">
<div class="about">Detail: </div>
@Html(comment.content.replace("\n", "<br>"))
</div>
<a href="@action(controllers.Application.replyComment(comment.id()))">Reply</a>
@comments filter { c => c.parent_id == comment.id } map {
c => @showComment(c)
}
</div>
}