2016-05-05 7 views
5

In meinem Spiel HTML-Vorlage in meinem custom Modul habe ich die folgende Codezeile:Automatisch injizieren WebJarAssets in Play 2.5 HTML-Vorlage?

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

Dies verweist auf eine WebJarAssets Klasse im core Modul, das wie folgt aussieht:

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) 

Bitte beachten dass ich auch folgende Zeile in build.sbt im custom Modul enthalten habe:

"org.webjars" %% "webjars-play" % "2.5.0", 

Wenn Sie die Anwendung starten, ich die folgende Fehlermeldung:

[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]                    ^

Geht man von der Umsetzung des WebJarAssets in früheren Versionen, gibt es keine Notwendigkeit, einen eigenen Controller für diesen (zum Beispiel zu implementieren und zu injizieren war, sehen diese tutorial).

Was mache ich falsch? Benötige ich dafür sogar eine WebJarAssets Klasse (da ich Web-Jar-Assets in vielen Modulen benötige, habe ich dies jetzt im Modul core hinzugefügt). Außerdem, warum muss ich es manuell in die Vorlage injizieren und warum wird es nicht automatisch gelöst?

Falls Sie sich fragen, was manuell Mittel für mich spritzen:

@(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> 

Antwort

7

Vor webjars-play2.5.0 es eine statische Methode war, die Sie in Ihren Vorlagen verwenden können. Da sich Play von globalen Status-/statischen Methoden wegbewegt hat, wurde das aus webjars-play entfernt und Sie müssen nun WebJarAssets injizieren. Leider unterstützen die Twirl Templates die Injektion noch nicht. Sie müssen es also in Ihren Controller injizieren und dann an Ihre Vorlage weitergeben. Hier ist eine vollständige Beispiel-App, die das tut: https://github.com/webjars/webjars-play/tree/master/test-project

+1

Vielen Dank für Ihre Erklärung. Ich denke jedoch, dass dieser neue Ansatz [zirkuläre Abhängigkeitsprobleme] eingeführt hat (http://stackoverflow.com/questions/37057137/how-to-prevent-circular-dependencies-when-using-webjarassets-play-2-5). –

+2

Ich mag diesen Ansatz nicht. Dies ist eine Verschlechterung. –

+0

@KhwarezmShah Können Sie ein Problem auf https://github.com/webjars/webjars-play mit weiteren Details einreichen? –

2

Es kann so schreiben.

Controller:

class Application @Inject()(implicit webJarAssets: WebJarAssets, 
          val messagesApi: MessagesApi, materializer: Materializer) 
    extends Controller with I18nSupport { 

Vorlage:

@(title: String)(content: Html)(implicit messages: Messages, webJarAssets: WebJarAssets) 
<script type='text/javascript' src='@routes.WebJarAssets.at(webJarAssets.locate("jquery.min.js"))'></script> 
1

Als @ james-Station, sagte in play-2.5.12 mit twirl-1.2.0 können Sie Abhängigkeiten in Vorlagen erklären injizieren, aber sie werden Klassen und nicht Objekte geworden, dass die kompliziert Verweis auf die Vorlagen von anderen.

Die Änderungen sind: auch

Projekt/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> 

Beachten Sie, dass ein Anrufer der Hauptvorlage sollte Deklarieren Sie einen Konstruktor mainClient.scala.html:

@this(mainRef: main) 
@(...) 

content 
@main("title"){ } 
content 
Verwandte Themen