Рекурсивные блоки в шаблонах Scala Play Framework - PullRequest
6 голосов
/ 10 октября 2011

Я пишу шаблон для блога, в котором есть комментарии.Естественный способ написания шаблона для многопоточных комментариев - использование рекурсивного способа построения 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 ]

4 голосов
/ 08 декабря 2012

Это работает для меня:

Заключить код в @{}

@{

    //use regular scala here:
    def showComment(comment: models.Comment):Node = {
    ....
    }
    //the above just declared a recursive method, now call it:

   showComment(...)

}
  • определить рекурсивный метод
  • вызвать метод в конце блока
  • прибыль!
2 голосов
/ 03 февраля 2015

Мне удалось обойти это, переместив рекурсивный шаблон в собственный файл.

0 голосов
/ 10 октября 2011

В Scala рекурсивному методу требуется тип возвращаемого значения: см. Почему Scala требует тип возвращаемого значения для рекурсивных функций?

Я не знаю много (больше похоже на ничего) оИграйте в 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>
}
...