在PlayFramework 2.x模板中类似于isFirst/isLast的东西

3
我正在PlayFramework 2.1.2中这样迭代一个变量:
  @for(l: Lang <- Globals.availableLangs) {
    @if(l != ctx.lang) {
      <a ng-click="i18nManager.changeLanguage('@l.code')" prevent-default href="#">@Messages("global.footer.langChange." + l.code.replace("-","_"))</a>
    }
  }

我希望在循环生成的每个"a"之间添加&nbsp;&middot;&nbsp;。在PlayFramework 1.x中,我们可以使用{list}标签的_isFirst_isLast。在Play Framework 2.x中应该如何实现呢?
我需要像这样的效果:
  @var first = true
  @for(l: Lang <- Globals.availableLangs) {
    @if(!first) { &nbsp;&middot;&nbsp; @first = false}
    @if(l != ctx.lang) {
      <a ng-click="i18nManager.changeLanguage('@l.code')" prevent-default href="#">@Messages("global.footer.langChange." + l.code.replace("-","_"))</a>
    }
  }
1个回答

1
如果您需要访问第一个和最后一个元素,您可以使用在Immutable List API中找到的headlast。为了避免再次迭代头部,请仅迭代列表的tail部分。
@defining(@Globals.availableLangs.filterNot(_ == ctx.lang).head){ l =>
  <a ng-click="i18nManager.changeLanguage('@l.code')" prevent-default href="#">@Messages("global.footer.langChange." + l.code.replace("-","_"))</a>  
}
@for(l: Lang <- Globals.availableLangs.filterNot(_ == ctx.lang).tail) {
      &nbsp;&middot;&nbsp;
      <a ng-click="i18nManager.changeLanguage('@l.code')" prevent-default href="#">@Messages("global.footer.langChange." + l.code.replace("-","_"))</a>   
}

编辑 误读了您的意图,已更新以匹配它。

编辑2 添加了过滤器以消除条件检查。


谢谢提醒,我可以在模板上使用Scala的所有功能!我完全忘记了这一点。我修改了我的代码,现在它可以实现我想要的功能:@for(l: Lang <- Globals.availableLangs.filterNot(_ == ctx.lang)) { @if(Globals.availableLangs.filterNot(_ == ctx.lang).head != l) { &nbsp;&middot;&nbsp; } <a ng-click="i18nManager.changeLanguage('@l.code')" prevent-default href="#">@Messages("global.footer.langChange." + l.code.replace("-","_"))</a> } 如果您编辑帖子并添加此代码,我将标记为已回答。 - Umut Benzer
@UmutBenzer 我更新了我的代码,使用了你的过滤器方法,但是我仍然会使用头/尾方法而不是每次迭代都过滤列表来检查头部。 - damian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接