映射变量在Scala Play HTML模板中不可用

时间:2013-11-12 06:13:11

标签: html scala playframework playframework-2.0

我在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}> ...没有引号!该死的。

3 个答案:

答案 0 :(得分:0)

据我所知,在新模板中声明新变量有一些限制,但您可以使用这样的解决方法:

@createDiv(format: String) = {
  <div id="@format">
    @format
  </div>
}

并在您的代码中使用它:

@formats.map(format => {
  createDiv(format.toString)
})

这对我有用。希望这个解决方案适合你。

答案 1 :(得分:0)

似乎存在名称冲突然后您使用“format”作为变量名称可能是因为String.format,尝试使用不同的名称

@formats.map{f =>
<div id="@f">
    @f
</div>
}

答案 2 :(得分:0)

以下对我有用:

@{
    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>
相关问题