2010-11-29 65 views
1

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

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

回答

10

简而言之:No. Lift的设计严格地将逻辑与设计分开,并且禁止在模板标记中使用通用标签。

查看view first article以查看lift如何处理迭代。

从文章中的一个例子:你的标记:

<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期间替换虚拟变量和值。因此,模板设计人员可以使用或多或少有意义的内容来填充标签,从而使编码人员能够更好地理解设计人员所考虑的语义。

+1

感谢您的解释和快速回复。 :) – ksemeks 2010-11-29 14:57:54