2016-05-05 8 views
5

W mojej sztuce szablonu HTML wewnątrz mojego modułu custom, mam następujący wiersz kodu:Automatycznie wstrzykuj WebJarAssets w szablonie HTML Play 2.5?

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

ten odwołuje się do klasy WebJarAssets w module core, który wygląda tak:

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) 

Zwróć uwagę że dodałem również następujący wiersz w build.sbt w module custom:

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

Po uruchomieniu aplikacji pojawia się następujący błąd:

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

Sądząc realizacji WebJarAssets We wcześniejszych wersjach nie było potrzeby, aby wdrożyć i wstrzyknąć własny kontroler do tego (na przykład zobaczyć tutorial).

Co robię źle? Czy potrzebuję nawet klasy WebJarAssets (ponieważ potrzebuję zasobów słoika internetowego w wielu modułach, dodałem to na razie w module core). Ponadto, dlaczego muszę ręcznie wstrzyknąć go w szablon i dlaczego nie jest automatycznie rozwiązany?

W przypadku wątpliwości co ręcznie wprowadzić środki dla mnie:

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

Odpowiedz

7

Przed webjars-play2.5.0 było statyczne metody, które można używać w szablonach. Ponieważ Play odchodzi od globalnych metod statycznych/statycznych, został usunięty z webjars-play, a teraz musisz wstrzyknąć WebJarAssets. Niestety szablony Twirl nie obsługują jeszcze wtrysku. Musisz więc wstrzyknąć go do kontrolera, a następnie przekazać go do szablonu. Oto pełna przykładowa aplikacja, która to robi: https://github.com/webjars/webjars-play/tree/master/test-project

+1

Dziękuję za wyjaśnienia. Jednak myślę, że to nowe podejście wprowadziło [kwestie zależności cyklicznej] (http://stackoverflow.com/questions/37057137/how-to-prevent-circular-dependencies-when-using-webjarassets- play-2-5). –

+2

Nie podoba mi się to podejście. To jest degradacja. –

+0

@KhwarezmShah Czy możesz zgłosić problem na https://github.com/webjars/webjars-play z dodatkowymi informacjami? –

2

Może tak pisać.

kontroler:

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

szablon:

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

Jako @ james-oddziale powiedział w play-2.5.12 z twirl-1.2.0 można zadeklarować wstrzyknąć współzależności w szablonach, ale staną się zajęcia, a nie przedmioty, które komplikuje odniesienie do szablonów z innych.

Zmiany są:

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> 

Zauważ, że dzwoniący głównego szablonu powinien także zadeklaruj konstruktora mainClient.scala.html:

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

content 
@main("title"){ } 
content 
Powiązane problemy