Автоматически внедрять 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-play2.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
Другие вопросы по тегам