模板 – 玩!框架2.0 – 通过Scala模板中的地图循环?
我有一个表示目录的地图,它包含章节键和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的_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的生成的东西在完成后会附加到一个返回的序列. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |