【问题标题】:Automatically inject WebJarAssets in Play 2.5 HTML template?在 Play 2.5 HTML 模板中自动注入 WebJarAssets?
【发布时间】:2016-08-30 19:40:44
【问题描述】:

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

<script type="text/javascript" src="@controllers.core.routes.WebJarAssets.at(WebJarAssets.locate("jquery.min.js"))"></script>

这引用了core 模块中的WebJarAssets 类,如下所示:

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 类(因为我需要许多模块中的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>

【问题讨论】:

    标签: scala playframework sbt webjars playframework-2.5


    【解决方案1】:

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

    【讨论】:

    【解决方案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>
    

    【讨论】:

      【解决方案3】:

      正如@james-ward 在play-2.5.12twirl-1.2.0 中所说,您可以在模板中声明注入依赖项,但它们将成为类而不是对象,从而使其他模板的引用变得复杂。

      变化如下:

      project/plugins.sbt

      addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.2.0")
      

      ma​​in.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>
      

      请注意,主模板的调用者还应声明构造函数ma​​inClient.scala.html

      @this(mainRef: main)
      @(...)
      
      content
      @main("title"){   }
      content
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多