我的一个 Play .scala.html 模板中有以下代码:
@formats.map(format => {
<div id="@format">
{format}
</div>
})
formats
是枚举的Seq
。div 是使用正确的"格式"内容创建的(每个内容都包含不同的格式字符串),但是,ID 永远不会正确设置。每个div 的 id 字面上都设置为"@format",如下所示:
<div id="@format">
OneOfTheFormats
</div>
<div id="@format">
AnotherFormat
</div>
我尝试使代码<div id="{format}">
、<div id={format}>
和<div id=@format>
,但没有运气。这很奇怪,因为我在其他模板中也做了类似的事情,但也许由于特殊map
情况,它不起作用......也许是因为format
是一个创建的参数,而不是传递到模板中?
更新:
正如下面的人建议的那样,我尝试了以下内容:
@{
def createDiv(f: String) = {
<div id="@f">
{f}
</div>
}
formats.map(f => {
createDiv(f.toString)
})
}
同样,格式在div 中正确打印,但从未设置 ID。我开始认为这是不可能的。我也尝试过<div id="@f">
、<div id="{f}">
和<div id="@{f}">
,但没有运气。奇怪的是,为了在div中打印格式,我必须使用{f}
,而不是@f
。还在这里挣扎...
更新 2:
如果我执行以下操作,它可以工作:<div id={f}>
...没有引号!该死的。
据我所知,在新模板中声明新变量有一些限制,但您可以使用这样的解决方法:
@createDiv(format: String) = {
<div id="@format">
@format
</div>
}
并在您的代码中使用它,如下所示:
@formats.map(format => {
createDiv(format.toString)
})
这对我有用。希望此解决方案适合您。
似乎存在名称冲突,然后您使用"format"作为变量名称可能是因为String.format,请尝试使用其他名称
@formats.map{f =>
<div id="@f">
@f
</div>
}
以下内容对我有用:
@{
def createDiv(format: String) = {
<div id={format}>
{format}
</div>
}
formats.map(format => {
createDiv(format.toString)
})
}
请注意封闭的@{ }
块,并且<div id={format}>
的 id 部分周围没有引号。
更新:
我最终做了一些更干净的事情 - 我使用了一个单独的模板文件。代码现在看起来有点像这样:
@formats.map(f => {
// do some other stuff
// render format subview
formatSubView(f, otherStuff)
})
子视图模板如下所示:
@(f: theFormatEnum,
otherStuff: lotsOfOtherStuff)
<div id="@f">
<img src="@{routes.Assets.at("images/" + f + ".png")}"/>
// etc, etc
</div>