Templates Scala/Lift-试图理解Lift';s同时声称在render中使用有效的html和lift:tags和tag重写的倾向
所有这七件事()当然都很好,但我对Templates()中“Lift支持设计师友好的模板”的说法特别感兴趣 作为学习Lift做事方式的一个步骤,我正在尝试创建一个简单的对象创建表单:获取一些参数,将它们用作构造函数参数,然后将对象收起。经过一些研究和实验,tho,我有两个顾虑:Templates Scala/Lift-试图理解Lift';s同时声称在render中使用有效的html和lift:tags和tag重写的倾向,templates,html,scala,xhtml,lift,Templates,Html,Scala,Xhtml,Lift,所有这七件事()当然都很好,但我对Templates()中“Lift支持设计师友好的模板”的说法特别感兴趣 作为学习Lift做事方式的一个步骤,我正在尝试创建一个简单的对象创建表单:获取一些参数,将它们用作构造函数参数,然后将对象收起。经过一些研究和实验,tho,我有两个顾虑: 似乎有相当大的倾向在片段中显著重写/修饰模板标记 表单似乎没有使用有效或可识别的html元素 我的依据是: 表单示例/文档似乎都是关于特殊的lift:tags。探索电梯意味着一个窗体应该是这样的:() 我甚至不确定
我甚至不确定这是否是有效的html5,虽然它可能是有效的xhtml,但对于我们的设计师朋友来说,这似乎不符合让模板看起来像真正的html的精神。我在其他地方读到(再也找不到了),我们确实可以选择使用实际的输入标记,但是我们不会得到Lift的花式表单wire的某些部分,这篇文章不是很清楚我到底遗漏了什么,而且示例似乎对我编写一个简单的html表单制作一个简单的html帖子不感兴趣
demo.liftweb.net示例(1)的代码建议您的模板如下所示(2)
PersonScreen代码片段也不是很有启发性(3)。还有一些模板的其他示例,例如,在特定位置只有一个ul标记,仅用于生成一系列复杂li,其中包含代码段中的嵌套元素。当然,您可以在Scala中使用xml,它的可读性还可以,但它仍然将您的标记分散在各个地方。这似乎违背了“设计师友好模板”的精神
我想了解的。
很长一段时间以来,我在开发webapp时严格遵守了两条规则:
第二个环节很有帮助,也很有启发性,但它清楚地表明,这不是提升方式。然而,Lift方式似乎也将整个标记生成过程拖到了代码段中,这(我认为)是标记和业务逻辑的巨大组合。那是电梯通道吗?那些是老式标签,不是设计师友好型标签
<lift:MySnippet>
<b:field />
</lift:MySnippet>
这将产生以下结果:
<div>
<div class="field">some text here</div>
</div>
这里有一些文字
不可能在提升模板中放入任何逻辑-它们所能做的就是调用提升片段,这是所有工作都发生在其中的常规Scala类
Lift放弃了在实际代码中不应该有任何显示逻辑的规则。为什么?因为它使代码更加可重用,因为Scala在语言中提供了强大的XML支持,并且因为您的所有逻辑现在都被视为普通的Scala代码
如果我定义了一个名为CurrentTime
的Lift片段,我可以简单地将其放入任何模板中,它将显示当前时间-对于老式的MVC框架,每个操作方法都需要将时间设置为页面变量,然后需要修改模板以将其打印出来。对于更复杂的逻辑,老式的框架可能需要在模板中添加一个条件。Lift不允许这样做——您所有的逻辑都是常规的Scala代码,可以进行重构,易于测试,并且与现代IDE兼容。在回答您的“我的想法是什么?”
<lift:MySnippet>
<b:field />
</lift:MySnippet>
<div class="lift:MySnippet">
<div class="field"></div>
</div>
<lift:MySnippet>
<frobnicate:blorb />
</lift:MySnippet>
class MySnippet {
def render(in: NodeSeq): NodeSeq = ".field" #> Text("some text here")
}
<div>
<div class="field">some text here</div>
</div>
<div lift="YourSnippet.method">
<p>Some other code</p>
</div>