在 Play 2.5 HTML 模板中自动注入 WebJarAssets?
Automatically inject WebJarAssets in Play 2.5 HTML template?
在我的 custom
模块内的 Play HTML 模板中,我有以下代码行:
<script type="text/javascript" src="@controllers.core.routes.WebJarAssets.at(WebJarAssets.locate("jquery.min.js"))"></script>
这引用了 core
模块中的 WebJarAssets
class,如下所示:
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)
请注意,我还在 custom
模块的 build.sbt
中包含了以下行:
"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 的实现来看,没有必要为此实现和注入自己的控制器(例如,参见此 tutorial)。
我做错了什么?我什至需要一个 WebJarAssets
class 吗(因为我需要在许多模块中使用 web 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>
在 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>
正如@james-ward 在 play-2.5.12
和 twirl-1.2.0
中所说,您可以在模板中声明注入依赖项,但它们将变为 类 而不是使对模板的引用复杂化的对象其他的。
变化是:
project/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
在我的 custom
模块内的 Play HTML 模板中,我有以下代码行:
<script type="text/javascript" src="@controllers.core.routes.WebJarAssets.at(WebJarAssets.locate("jquery.min.js"))"></script>
这引用了 core
模块中的 WebJarAssets
class,如下所示:
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)
请注意,我还在 custom
模块的 build.sbt
中包含了以下行:
"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 的实现来看,没有必要为此实现和注入自己的控制器(例如,参见此 tutorial)。
我做错了什么?我什至需要一个 WebJarAssets
class 吗(因为我需要在许多模块中使用 web 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>
在 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>
正如@james-ward 在 play-2.5.12
和 twirl-1.2.0
中所说,您可以在模板中声明注入依赖项,但它们将变为 类 而不是使对模板的引用复杂化的对象其他的。
变化是:
project/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