在Play 2.5 HTML模板中自动注入WebJarAssets?

时间:2016-05-05 06:00:14

标签: scala playframework sbt webjars playframework-2.5

在我的custom模块中的Play HTML模板中,我有以下代码行:

<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的实现来看,没有必要为此实现和注入自己的控制器(例如,请参阅此tutorial)。

我做错了什么?我是否甚至需要一个WebJarAssets类(因为我需要在许多模块中使用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>

3 个答案:

答案 0 :(得分:7)

webjars-play 2.5.0之前,您可以在模板中使用静态方法。由于Play已经远离全局状态/静态方法,因此已从webjars-play中删除,现在您需要注入WebJarAssets。不幸的是,Twirl模板还不支持注射。因此,您必须将其注入控制器,然后将其传递给模板。以下是完整的示例应用:https://github.com/webjars/webjars-play/tree/master/test-project

答案 1 :(得分:2)

它可以这样写。

控制器:

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>

答案 2 :(得分:1)

正如@ james-ward在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