Автоматически внедрять WebJarAssets в HTML-шаблон Play 2.5?
В моем шаблоне Play HTML внутри моего custom
модуль, у меня есть следующая строка кода:
<script type="text/javascript" src="@controllers.core.routes.WebJarAssets.at(WebJarAssets.locate("jquery.min.js"))"></script>
Это ссылки на WebJarAssets
класс в core
модуль, который выглядит так:
package controllers.core
import javax.inject._
import play.api.http.HttpErrorHandler
import play.api.{Environment, Configuration}
class WebJarAssets @Inject()(errorHandler: HttpErrorHandler, configuration: Configuration, environment: Environment) extends controllers.WebJarAssets(errorHandler, configuration, environment)
Обратите внимание, что я также включил следующую строку в build.sbt
в custom
модуль:
"org.webjars" %% "webjars-play" % "2.5.0",
При запуске приложения я получаю следующую ошибку:
[error] /Users/john/DemoProject/modules/custom/app/views/custom/templates/main.scala.html:36: not found: value WebJarAssets
[error] <script type="text/javascript" src="@controllers.core.routes.WebJarAssets.at(WebJarAssets.locate("jquery.min.js"))"></script>
[error] ^
Судя по реализации WebJarAssets в более ранних выпусках, для этого не было необходимости реализовывать и внедрять собственный контроллер (например, см. Это руководство).
Что я делаю неправильно? Нужно ли мне вообще WebJarAssets
класс для этого (так как мне нужны ресурсы веб-jar во многих модулях, я добавил это сейчас в core
модуль). Кроме того, почему мне нужно вручную вставить его в шаблон и почему он не разрешается автоматически?
В случае, если вам интересно, что для меня значит инъекция вручную:
@(title: String, webJarAssets: WebJarAssets)(content: Html)(implicit messages:Messages)
<script type="text/javascript" src="@controllers.core.routes.WebJarAssets.at(webJarAssets.locate("jquery.min.js"))"></script>
3 ответа
До webjars-play
2.5.0
был статический метод, который вы могли бы использовать в своих шаблонах. Так как Play удалялся от глобальных состояний / статических методов, он был удален из webjars-play
и теперь нужно вводить WebJarAssets
, К сожалению, шаблоны Twirl пока не поддерживают инъекцию. Таким образом, вы должны ввести его в свой контроллер, а затем передать его в свой шаблон. Вот полный пример приложения, которое делает это: https://github.com/webjars/webjars-play/tree/master/test-project
Это можно написать так.
контроллер:
class Application @Inject()(implicit webJarAssets: WebJarAssets,
val messagesApi: MessagesApi, materializer: Materializer)
extends Controller with I18nSupport {
шаблон:
@(title: String)(content: Html)(implicit messages: Messages, webJarAssets: WebJarAssets)
<script type='text/javascript' src='@routes.WebJarAssets.at(webJarAssets.locate("jquery.min.js"))'></script>
Как сказал @ Джеймс-Уорд в play-2.5.12
с twirl-1.2.0
Вы можете объявить зависимости внедрения в шаблонах, но они станут классами, а не объектами, что усложнит ссылку на шаблоны из других.
Изменения:
Проект / plugins.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.2.0")
main.scala.html
@this(webJarAssets: WebJarAssets)
@(title: String)(content: Html)(implicit messages:Messages)
<script type="text/javascript"
src="@controllers.core.routes.WebJarAssets.at(webJarAssets.locate("jquery.min.js"))">
</script>
Обратите внимание, что вызывающая сторона основного шаблона должна также объявить конструктор mainClient.scala.html:
@this(mainRef: main)
@(...)
content
@main("title"){ }
content