【问题标题】:Map variables not usable in Scala Play HTML template映射变量在 Scala Play HTML 模板中不可用
【发布时间】:2013-11-24 04:32:47
【问题描述】:

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

我尝试编写代码&lt;div id="{format}"&gt;&lt;div id={format}&gt;&lt;div id=@format&gt;,但没有成功。这很奇怪,因为我在其他模板中做过类似的事情,但可能因为特殊的 map 案例而无法正常工作......也许是因为 format 是一个创建的参数,而不是传递到模板中?

更新:

按照下面的建议,我尝试了以下方法:

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

    formats.map(f => {
        createDiv(f.toString)
    })
}

再一次,格式正确地打印在 inside div 中,但从未设置 ID。我开始认为这是不可能的。我也尝试过&lt;div id="@f"&gt;&lt;div id="{f}"&gt;&lt;div id="@{f}"&gt;,但没有成功。奇怪的是,为了打印 div 内的格式,我必须使用{f},而不是@f。还在苦苦挣扎……

更新 2:

如果我执行以下操作,它会起作用:&lt;div id={f}&gt; ... 没有引号!该死的。

【问题讨论】:

    标签: html scala playframework playframework-2.0


    【解决方案1】:

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

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

    并像这样在您的代码中使用它:

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

    这对我有用。希望此解决方案适合您。

    【讨论】:

    • 嗯...这可能很接近,但我遇到了麻烦:我收到了一个 not found: value createDiv 错误,尽管在 @formats.map 上方定义了 @createDiv。很奇怪 - 我会继续摆弄它。
    【解决方案2】:

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

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

    【讨论】:

    • 不,遗憾的是它看起来不像是名称冲突。
    • 你试过我的样品了吗?它对我有用,但后来我将“f”变量重命名为“format”它不再
    • 是的,我试过了,但是没有用。您使用的是 Play 2.2.0 吗?这就是我正在做的。也许我遇到了一些奇怪的图书馆问题或其他什么。晚上回家后我会再试一次。
    【解决方案3】:

    以下内容对我有用:

    @{
        def createDiv(format: String) = {
            <div id={format}>
                {format}
            </div>
        }
    
        formats.map(format => {
            createDiv(format.toString)
        })
    }
    

    注意封闭的@{ } 块,&lt;div id={format}&gt; 的 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2011-03-26
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多