2014-10-09 58 views
4

我有一個名爲mainBody與表單模板:播放框架模板沒有HTML類型

@(title: String)(html: Html, moreScripts: Html = Html("")) 

我能夠把這個像

views.html.mainBody("All properties")(views.html.showProperties(list)) 

views.html.showProperties()是另一個模板。我的印象是模板只是返回Html的函數。但是,如果我延長這:

views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts) 

哪裏views.html.showPropertiesScripts只是一些HTML代碼模板,我得到的錯誤:

play.PlayExceptions$CompilationException: Compilation error[type mismatch; 
found : views.html.showPropertiesScripts.type 
required: play.twirl.api.Html] 
     at play.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na] 
     at play.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na] 
     at scala.Option.map(Option.scala:145) ~[scala-library-2.11.2.jar:na] 
     at play.PlayReloader$$anon$1$$anonfun$play$PlayReloader$$anon$$taskFailureHandler$1.apply(PlayReloader.scala:234) ~[na:na] 
     at play.PlayReloader$$anon$1$$anonfun$play$PlayReloader$$anon$$taskFailureHandler$1.apply(PlayReloader.scala:229) ~[na:na] 

我不明白這一點。而不是預期的類型Htmlviews.html.showPropertiesScriptsviews.html.showPropertiesScripts.type?這是什麼,爲什麼views.html.showPropertiesScripts不是Html(就像我的其他模板)?

回答

1

我想你」重新混合「類型」與「返回類型」。推測是views.html.showPropertiesScripts是一個不帶任何參數的模板(以@()開頭)。如果是這種情況,它沒有類型Html,而是一個帶有def apply(): Html的類,這就是爲什麼當你用圓括號「叫」它時,它返回Html。你可以把它看作是() => Html。您應該嘗試:

views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts()) 

您可能會對calling a method without a parameter list的概念感到困惑。這在處理apply時不起作用,因爲如果關閉參數列表,Scala會將您解釋爲指的是對象本身,而不是apply的結果。

3

使用此類似mainBody.scala.html

@(title: String, moreScripts: Html = Html(""))(html: Html) 
<!DOCTYPE html> 
<html> 
    <head lang="en"> 
     <title>@title</title> 
     @moreScripts 
    </head> 
    <body> 
     @html 
    </body> 
</html> 

的觀點:

@(list: List[YourType]) 

@moreScripts = { 
    <script>alert ('it works')</script> 
} 

@mainBody(title = "All properties", moreScripts = moreScripts) { 
    @showProperties(list) 
} 

moreScripts是可選的,你可以跳過它的另一種觀點:

@(list: List[YourType]) 

@mainBody(title = "Other view") { 
    @showProperties(list) 
} 
+0

這個工程,我喜歡比我的風格更好。但是,請你解釋爲什麼這個工作原理和我的原始代碼不是? – Mike 2014-10-09 23:35:11

+0

Mike TBH我從未分析過Play的模板引擎,如果您感興趣,請下載源代碼;)一般規則是在第一個括號中聲明視圖的所有參數(強制性和可選),並在第二個帶有內容的「Html」中聲明。 – biesior 2014-10-10 08:02:51

+0

好得多。作品。 – 2016-11-08 17:28:25