Динамические маршруты на шаблонах Play Framework 2.1
Взяв образец компьютерной базы данных Java в качестве отправной точки в Play! 2.1 Я разрабатываю серверную часть CRUD для примерно 20 моделей. Проблема, с которой я сталкиваюсь, - это повторение на уровне шаблона одних и тех же функций снова и снова.
Я попытался реорганизовать функцию ссылки как:
@****************************************
* Helper generating navigation links *
****************************************@
@link(newPage:Int, newSortBy:String) = @{
// Generate the link
controllers.admin.routes.Model.index(newPage, "id", newSortBy)
}
Что-то вроде
@(controller: Any, newPage: Int, newSortBy: String)
any.index(newPage, "id", newSortBy)
Поскольку обратные маршрутизаторы не наследуются от какого-либо определенного класса, я не могу сделать это в общем виде. И предыдущий код не работает, так как я не выполняю приведение типов (я полагаю, поскольку ошибка компилятора "значение индекса не является членом Any")
Можно ли как-нибудь получить список определенных маршрутов во время выполнения? Не имеет значения, находится ли он в шаблоне Scala или на стороне Java, таким образом я могу передать имя контроллера и получить правильный обратный маршрутизатор для создания URL.
Если это невозможно, то как правильно реорганизовать весь тот код, который повторяется снова и снова по шаблонам, особенно те, которые зависят от ReverseRouters.
1 ответ
Я не нашел способа получить список маршрутизаторов и реверсивных маршрутизаторов динамически, но я нашел способ ограничить количество кода базовой платы и иметь возможность рефакторинга шаблонных функций в свои собственные файлы, делая код более управляемым,
Я обнаружил, что Scala - это не другой способ сказать Java!!! В частности, вы можете передать функции в качестве параметра функции ( http://oldfashionedsoftware.com/2008/08/23/fun-with-scala-functions/), так что вы можете передать часть кода, которая будет выполнена на подшаблоне из основного шаблона (вид DI).
В приведенном мной примере проблема заключалась в передаче обратного контроллера в подшаблоны из основного шаблона, но "обратные контроллеры" не расширяют какой-либо конкретный объект. Код в примерах:
template.scala.html
...
...
@****************************************
* Helper generating navigation links *
****************************************@
@link(newPage:Int, newSortBy:String) = @{
// Generate the link
controllers.admin.routes.MyController.index(newPage, "id", "asc")
}
...
...
@**********************************
* Helper generating table headers *
***********************************@
@header(key:String, title:String) = {
<th class="">
<a href="@link(0, key)">@title</a>
</th>
}
...
...
Реорганизовать header
функция в свой собственный шаблон, я должен быть в состоянии вызвать link
функция. Использование включений из переработанного файла не будет работать, поскольку обратный контроллер жестко задан в link
функция. Решение состоит в том, чтобы извлечь header
Функция для подшаблона и определить параметр шаблона, который будет функцией:
просмотров / Utils / header.scala.html
@(key: String, title:String, link: (Int) => Html)
<th class="@key">
<a href="@link(0)">@title</a>
</th>
А теперь в шаблоне:
просмотров / админ / template.scala.html
...
@import utils._
...
@link(newPage:Int) = {
@controllers.admin.routes.MyController.index(newPage, "id", "asc")
}
...
@header("key", "title", link _)
...
Теперь мне нужно только определить link
Функция для каждого из основных шаблонов и передать его в качестве параметра для любых подшаблонов, которые нуждаются в этом. Не полностью чистая, но значительно уменьшает котельную плиту и облегчает смену шаблона.
Надеюсь, что это помогает другим. Лучшее решение кто-нибудь?