怎么在Play之间洗牌! Scala中的模板

时间:2014-03-04 15:09:00

标签: scala playframework-2.2

我有一个包装模板,如下所示:

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

1 个答案:

答案 0 :(得分:1)

你几乎就在那里:)

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

注意括号。 abc的类型现在是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)),以便他们生成{ {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

请注意,此解决方案远非完美,我建议您不要在现实生活中使用。我认为不应该以这种方式使用视图。