加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

模板 – 玩!框架2.0 – 通过Scala模板中的地图循环?

发布时间:2020-12-16 09:18:49 所属栏目:安全 来源:网络整理
导读:我有一个表示目录的地图,它包含章节键和List [Section]值.现在我试图在我的模板中循环遍历这样: dl@table_of_contents.foreach((e) = { dt @e._1.title /dt for(section - e._2){ dd @section.title /dd }})/dl 我目前在 dl中没有输出然而. 我在模板的顶部
我有一个表示目录的地图,它包含章节键和List [Section]值.现在我试图在我的模板中循环遍历这样:

<dl>
@table_of_contents.foreach((e) => {
    <dt>
        @e._1.title
    </dt>
        for(section <- e._2){
        <dd>
            @section.title
        </dd>
        }
})
</dl>

我目前在< dl>中没有输出然而.

我在模板的顶部添加了一个println(table_of_contents)语句,以确保该地图实际上具有数据并打印出来:

{models.Chapter@1=BeanList size [4] hasMoreRows [false] list [models.Section@1,models.Section@2,models.Section@3,models.Section@4],models.Chapter@2=BeanList size [0] hasMoreRows [false] list []}

也许我需要使用强制风格?

更新:

仍然在这个工作…得到这个变体编译,但没有输出.

<dl>
@table_of_contents.foreach{case(a,b) => {
    <dt>
        @a.title
    </dt>
        @displaySections(b)
}}
</dl>

...

@displaySections(sections: List[Section]) = {
  @for(a_section <- sections) {
        <dd>@a_section.title</li>
  }
}

解决方法

TL;博士

迄今给出的答案(@wbarksdale,@PlexQ和@Daniel C. Sobral在评论中)足以对付这里描述的问题.

但是,他们缺少一个真正的解释,为什么使用foreach的初始代码不起作用.

它不能工作,因为foreach返回单位.

玩概念

让我快速注意/回想一下模板如何工作.

在Play Framework 2中默认提供的Scala模板系统确实建立在FP概念上,因此它使用了大量不可变的结构等等.

此外,这样的Scala模板(我们说myTemplate.scala.html)将被编译成一个常规的Scala对象,该对象具有一个调用的apply方法.后一个函数使我们能够使用一些参数(在模板的第一行中声明的参数)来调用该对象.

这个对象也依赖于一个像输出格式化(Html)这样构建的BaseScalaTemplate这样的结构.这个格式化程序将能够获取东西(如String,Unit,Seq [Int],Map [A??,B] …),并将其呈现为HTML代码.

使用BaseScalaTemplate的_display_方法时会进行格式化,该方法返回格式化输出的一个实例.该显示方法将在对象的apply方法的body中的.scala.html文件的编译代码中调用.

所以身体可以这样结束:

def apply/*1.2*/(testMap:scala.collection.immutable.Map[String,Int]):play.api.templates.Html = 
  _display_ {
    Seq[Any](
      _display_(
        Seq[Any](
          /*3.2*/testMap/*3.9*/.map/*3.13*/ { e =>
            _display_(Seq[Any](_display_(Seq[Any](/*5.3*/e))))
          }
        )
      )
    )
  }

看到? _display_调用并不是任何变体,只是它们的组合方式应用自身会返回格式化代码(Html)的一个实例!

这给了我们线索…

是啊blah blah …现在为什么?

在关于Play内部的闪电之后,我们现在可以解决真正的问题:为什么地狱是问题帖子中提供的理想Scala代码不工作…读取,根本不输出任何内容.

这很简单,当在地图上使用foreach时,你确实循环了这些项目,并将它们调整为Html.但是,这些计算将不会被模板系统使用,因为它们被包含在foreach的循环中.当序列中的每个项目都需要副作用时,必须使用foreach …并且在完成后返回Unit.

既然,模板系统将尝试_display_给定Map上的foreach的结果,它将简单地渲染/格式化Unit,从而形成一个空的String!

总而言之,只需使用将返回一个新序列的地图,该序列将保存适应的项目,即Html实例.

嗯,为什么呢?

是的,你是对的…根据所说的,为什么提出使用for循环工作的答案,因为没有产生一个值,一个等于foreach! (引入收益将以类似地图的行为结束)

答案是在代码中…模板编译器将前缀为关键字的关键字的身体 – 检查这个here.:DD

Etvoilà,它也有效,因为在body的生成的东西在完成后会附加到一个返回的序列.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读