liftweb有迭代标签吗?

时间:2010-11-29 14:41:27

标签: scala iteration jsp-tags lift

我在想,Lift是否有迭代标记(例如:for,foreach)? 当我使用JSP时,我可以轻松地使用JSP迭代List,将对象传递给标记。类似于thislike this的内容。 我知道这不是最好的例子,但你明白我的意图。 总而言之,这与Lift存在,或者如果不存在,我将如何设法做这样的事情?

我想做的最后一件事是硬编码html。

1 个答案:

答案 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期间被替换。因此,模板设计者可以使用或多或少有意义的内容填充标记,这使得编码人员能够更好地理解设计者所考虑的语义。