我有一个包装模板,如下所示:
@(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 ...
所以我不能在shuffle之前使用括号。只有在洗牌之后,我才会发布真假的真假。
使用这种方法:
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 :(得分:1)
你几乎就在那里:)
val a = views.html.a()
val b = views.html.b()
val c = views.html.c()
注意括号。 a
,b
和c
的类型现在是play.api.templates.HtmlFormat.Appendable
而不是之前的类型。
现在您可以根据需要传递它:
Ok(views.html.wrapper(list(0), list(1), list(2)))
修改强>:
好的,我无法想象你在做什么(如果可能的话,可以简化解决方案)但我找到了解决方法。
首先,请考虑视图a
,b
和c
位于层次结构的一个级别:
/ a
BaseScalaTemplate - b
\ c
要使此解决方案有效,这些视图必须具有相同数量的参数(a(check: Boolean)
,b(check: Boolean)
,c(check: Boolean)
),以便他们生成{ {1}}(表示“带有一个布尔参数的通用模板”)。
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
请注意,此解决方案远非完美,我建议您不要在现实生活中使用。我认为不应该以这种方式使用视图。