我在想,Lift是否有迭代标记(例如:for,foreach)? 当我使用JSP时,我可以轻松地使用JSP迭代List,将对象传递给标记。类似于this或like this的内容。 我知道这不是最好的例子,但你明白我的意图。 总而言之,这与Lift存在,或者如果不存在,我将如何设法做这样的事情?
我想做的最后一件事是硬编码html。
答案 0 :(得分:10)
简而言之:No。Lift的设计严格地将逻辑与设计分开,因此禁止在模板标记中使用通用标签。
查看view first article,了解电梯如何处理迭代。
文章中的一个例子:你的标记:
<table>
<lift:show.users>
<tr>
<td><f:first_name>David</f:first_name></td>
<td><f:last_name>Pollak</f:last_name></td>
</tr>
</lift:show.users>
</table>
您的代码:
class Show {
def users(xhtml: NodeSeq): NodeSeq =
Users.findAll.flatMap(user =>
bind("f", xhtml,
"first_name" -> user.firstName,
"last_name" -> user.nameName
)
)
}
现在,当标签<lift:show.users>
看到标签的内容作为参数调用相应的方法时,它会做什么。然后,该标记将被users
方法的返回值替换。
users
方法对所有Users
进行迭代,对于每个用户,bind
是内部xhtml
的第一个和第二个名称的值。然后将所有这些迭代连接起来(通过flatMap
)并返回。
当我开始使用升降机时,我总是发现这种方法有点过于僵硬;在这里和那里有一个小环,怎么可能伤害?但是现在我知道从模板代码调用和创建自己的代码片段是多么容易,我无法想象再使用像jsp这样的东西了。相比之下它很弱并且你的标记变得混乱。当然,你失去了Scala的验证能力。
备注:强>
模板标签填充内容的原因是出于设计目的。在这种情况下,虚拟标签和值将在bind
期间被替换。因此,模板设计者可以使用或多或少有意义的内容填充标记,这使得编码人员能够更好地理解设计者所考虑的语义。