2014-03-04 57 views
1

模板,我有一個包裝的模板,看起來像這樣:如何在Play之間洗牌!在斯卡拉

@(first: Html, second:Html, third:Html) 
<div class="wrapper"> 
@first 
@second 
@third 
</div> 

我有三個模板,我想重新洗牌,並將作爲第一,第二和第三。我們將它們命名爲:views.html.a,views.html.b,views.html.c。

控制器代碼:

val a = views.html.a 
val b = views.html.b 
val c = views.html.c 

val list = Random.shuffle(List(a, b, c)) // Will use Random.shuffle here but it fails complication either way 

Ok(views.html.wrapper(list(0)(), list(1)(), list(2)())) 

併發症發生錯誤:

play.templates.BaseScalaTemplate[play.api.templates.HtmlFormat.Appendable,play.templates.Format[play.api.templates.HtmlFormat.Appendable]] does not take parameters 

它顯示爲輸入對象的列表,並得到它的技巧編譯器。

如果我不使用列表,這樣做:

Ok(views.html.wrapper(a(), b(), c())) 

它工作正常,並呈現頁面。

我知道我可以將隨機邏輯移動到包裝模板,但我更願意理解/修復當前的實現並學習一些Scala。

感謝

編輯

閱讀serejja的回答後,我會增加複雜性的問題,因爲這更好地代表我所面臨的問題。 三個模板需要採取一個布爾所以views.html.a樣子:

@(checkMe:Boolean) 
<div ... 

所以我不能在洗牌前使用括號。只有在洗牌發生之後,我才希望發出布爾人的真假。

使用這種方法:

Ok(views.html.wrapper(list(0)(true), list(1)(false), list(2)(true))) 

提供了以下編譯錯誤:

play.templates.BaseScalaTemplate[play.api.templates.Html,play.templates.Format[play.api.templates.Html]] with play.api.templates.Template1[Boolean,play.api.templates.Html] does not take parameters 
+0

你的意思是你必須調用模板像Ok(views.html.wrapper(list(0)(true),list(1)(false),list(2)(true)))''? – serejja

+0

是的,問題被編輯 –

+0

請參閱我的編輯以及 – serejja

回答

1

你幾乎有:)

val a = views.html.a() 
val b = views.html.b() 
val c = views.html.c() 

注意括號。 a,bc的類型現在是play.api.templates.HtmlFormat.Appendable而不是之前的那種。

現在,你可以把它作爲你想:

Ok(views.html.wrapper(list(0), list(1), list(2))) 

編輯

好吧,我無法想象你正在做什麼(所以該解決方案可以簡化如果可能的話),但我找到了一個解決方法。

首先,考慮的意見abc都在層次結構的一個級別:

   /a 
BaseScalaTemplate - b 
        \ c 

對於這個解決方案的工作,這些觀點必須具有相同數量的參數(a(check: Boolean)b(check: Boolean)c(check: Boolean)),以便它們生成一個List[play.templates.BaseScalaTemplate[play.api.templates.Html,play.templates.Format[play.api.templates.Html]] with play.api.templates.Template1[Boolean,play.api.templates.Html]](這意味着「具有一個布爾參數的通用模板」)。

play.api.templates.Template1有一個方法render它採用該參數並返回您HtmlFormat.Appendable(我前面提到過)。

考慮到這一點您的解決方案可能是這樣的:

val a = views.html.a 
val b = views.html.b 
val c = views.html.c 

val randomizedViews = Random.shuffle(List(a, b, c)) 

Ok(views.html.wrapper(list(0).render(true), list(1).render(false), list(2).render(true))) 

請注意,此解決方案是遠遠不夠完善,我會建議你不要在現實生活中使用它。我不認爲意見是用於這種方式。

+0

我編輯的問題,因爲這不能解決我認爲是無關的「更大」的問題 –

+0

[評論後編輯]謝謝!這確實解決了這個問題。我很好奇是否有比「解決方法」更好的解決方案,但我可以接受調用渲染。 =] –