地图变量在 Scala Play HTML 模板中不可用



我的一个 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>

最新更新