模板 – Scala / Lift – 试图了解Lift同时声称使用有效的html和
所有的七件事(
http://seventhings.liftweb.net/)都是不错的,但是对“模板”(
http://seventhings.liftweb.net/templates)中的“电梯支持设计师友好模板”的要求尤其热烈.
作为我在学习Lift的方法之一的步骤之一,我试图创建一个简单的对象创建表单:采取几个参数,将它们用作构造函数参数,然后将对象存放.经过一番研究和实验,我有两点担忧: >在片段中显着重写/修饰模板标记似乎有相当大的倾向. 我以这个为基础: 表单示例/文档似乎都是关于特殊电梯:标签.探索电梯表明一个表单应该如下所示:(http://exploring.liftweb.net/master/index-6.html) <lift:Ledger.add form="POST"> <entry:description /> <entry:amount /><br /> <entry:submit /> </lift:Ledger.add> 我不确定这是甚么html5,而它可能是有效的xhtml,它不觉得这样符合你的模板看起来像我们的设计师的朋友真正的HTML的精神.我在别的地方看到(再也找不到),我们确实有选择使用实际的输入标签,但是我们不会得到电梯的一些部分,或者是某些东西,一段话不是很清楚关于我会错过什么,这些例子似乎并不感兴趣,我写了一个简单的html表单制作一个简单的html文章. demo.liftweb.net示例(1)的代码表明您的模板应该如下(2) <lift:surround with="default" at="content"> <div class="lift:PersonScreen"></div> </lift:surround> (3)PersonScreen代码片段的代码并不完全明确.模板的其他几个例子有,例如.在一个特定的位置只有一个ul标签,只能生成一系列复杂的li与代码段中的嵌套元素.当然,你可以在Scala中使用xml,它可以容忍地读取,但是它仍然会在任何地方散布你的标记.这似乎违反了“设计师友好模板”的精神. 我想要了解什么 很久以前,我在webapp开发中严格遵循了两个规则: >“代码”中无标记(控制器,商业模式). 惯用电梯似乎完全放弃了第一条规则,完全错失了第二条规则的价值.这些规则对我来说很好,我没有准备好跟随似乎违反他们的例子,而不理解为什么它不会造成混乱.我想了解为什么在Lift中可以在Snippets中生成这么多的显示代码.我也想了解为什么它的模板中的标记很少反映输出. 我想(我想) 我希望我的所有标记与我的模板中的非常少的异常(如果有的话)异常.我想要我的片段做最小的模板调整,通常只替换“叶”标签上的元素文本,并可能调整属性值.我想我已经做了一个相当复杂的显示示例,我怀疑我可以使用相同的技术来生成一个香草html表单,然后自己处理参数.如果我想要我的模板看起来像最终结果表格那样我需要做什么? 反应和任何其他想法,特别是了解关于这个东西的提升心态,将会非常感激. 谢谢! > http://demo.liftweb.net/simple_screen?F674431078927QJVVYD=_ 编辑 响应@ OXMO456. (感谢您的回复.) 我有,似乎只是证实了我的担忧:例如我们从:
这是真棒.后来呢
而且每个人似乎都使用了这两个机制中的第一个.另外,它说:
但是非常一致的例子中,我在OP中引用的示例代码完全以编程方式生成标记.这似乎违背了设计师友好模板的目标(a),因此设计人员不必受到Freemarker标记的困扰,(b)将显示逻辑与业务逻辑分开. 第二个环节是有帮助和有启发性的,但它很清楚,这不是电梯方式.然而,“升级”方式似乎也将一整套标记生成拖到了片段中,这是(我认为)巨大的标记和业务逻辑复合.这是电梯方式吗? 解决方法
那些是旧式标签,而不是设计师友好的标签.
<lift:MySnippet> <b:field /> </lift:MySnippet> 变 <div class="lift:MySnippet"> <div class="field"></div> </div> 旧式电梯模板是有效的XML,而不是XHTML,因此您不能有未关闭的标签或任何东西 – 这与大多数框架区别开来,这些框架将模板视为原始字符串,而不考虑标签或结构. BTW,在旧式标签中,这些字段都是制造的 – 它们不是某些标准的Lift标签的一部分.我可以很容易地做: <lift:MySnippet> <frobnicate:blorb /> </lift:MySnippet> 只要我的代码段正在寻找该特定的标签. 电梯不允许您的模板中的任何逻辑.所有的逻辑都发生在您的Snippet类中.所以对于上面的设计师友好示例,我可能会有一个这样的代码段: class MySnippet { def render(in: NodeSeq): NodeSeq = ".field" #> Text("some text here") } 这将产生这个结果: <div> <div class="field">some text here</div> </div> 在Lift模板中放置任何逻辑是不可能的 – 他们所能做的就是调用Lift片段,这是所有工作发生的常规Scala类. 电梯放弃您在实际代码中不应有任何显示逻辑的规则.为什么?因为它使得更多可重用的代码,因为Scala具有强大的XML支持,融入到语言中,并且因为所有的逻辑现在被视为纯旧的Scala代码. 如果我定义一个名为CurrentTime的Lift片段,我可以简单地将其放在任何模板中,并显示当前时间 – 使用旧的MVC框架,每个动作方法需要将时间设置为页面变量,然后我的模板将需要修改才能打印出来.对于更复杂的逻辑,老式的框架可能需要在模板中有条件.电梯不允许 – 您的所有逻辑都是常规Scala代码,符合重构条件,易于测试,并与现代IDE兼容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |