【问题标题】:Order of elements shown in generated HTML doesn't match the order of the elements in the collection生成的 HTML 中显示的元素顺序与集合中元素的顺序不匹配
【发布时间】:2014-07-18 08:16:47
【问题描述】:

我越来越难以理解为什么会发生这种情况:我有一个包含 6 个整数的集合(一个不可变的 SortedSet),我通过 .map 方法对它们进行迭代以创建我生成的 HTML。每次我重新加载页面时,HTML 页面中的元素总是以不同的顺序显示。

这是我的模板的一些摘录

@deltas = @{ scala.collection.SortedSet[Int]( -15, -10, -5, 5, 10, 15) }

     @*** More code here ***@

@Logger.debug("DELTAS="+deltas.toString())
@deltas.map { delta =>
<li>
  @Logger.debug("DELTA="+delta.toString())
  <a href="#">@{dist.toDouble.intValue + delta}&nbsp;km (@delta)</a>
</li>
}

我还尝试将输出记录到屏幕上 - 请参阅 Logger - 并且正如预期的那样,元素始终以正确的顺序显示。

[debug] application - DELTAS=TreeSet(-15, -10, -5, 5, 10, 15)
[debug] application - DELTA=-15
[debug] application - DELTA=-10
[debug] application - DELTA=-5
[debug] application - DELTA=5
[debug] application - DELTA=10
[debug] application - DELTA=15

现在我只能说问题一定出在模板引擎中,但我想知道它是否是一个错误(不太可能)或者我只需要了解更多关于它某些棘手方面的信息(很可能) .

【问题讨论】:

    标签: scala collections playframework playframework-2.3 twirl


    【解决方案1】:

    显然它似乎与模板引擎有关。我需要深入挖掘才能找出原因。此时我可以建议使用集合的迭代器来解决这个问题。

    @for(delta <- deltas.iterator) {
    <li>
      <a href="#">@{dist.toDouble.intValue + delta}&nbsp;km (@delta)</a>
    </li>
    }
    

    您也可以将 TreeSet 转换为 Seq 也可以解决问题。

    上一个

    更新前的第一条线索:

    您可以阅读此问题以了解有关 SortedSet 映射的更多信息

    SortedSet map does not always preserve element ordering in result?

    【讨论】:

    • 我已阅读您指出的帖子,但这与我在代码中得到的内容无关:如果您仔细查看我发布的代码和 Logger 输出,您'会同意我的观点,即相同的迭代在运行 Play 的终端(记录器)上给出了正确的结果,但在生成的 HTML 页面上,每次加载页面时我都有一个随机顺序(这是它的另一个证据与您的建议无关)。
    • 迭代器方法解决了问题!在您提出建议之前,我尝试了其他迭代技术,但没有运气......
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多