Scala/Lift - 试图理解Lift同时声称使用有效的html和倾向于提升:标记和标记重写在渲染中

Naj*_*ati 12 xhtml html5 templates scala lift

所有七件事(http://seventhings.liftweb.net/)当然都不错,但我特别热衷于模板(http://seventhings.liftweb.net/templates)声称"Lift支持设计师友好模板".

作为我学习Lift的做法的一个步骤,我正在尝试创建一个简单的对象创建表单:获取一些参数,将它们用作构造函数参数,然后将对象存放起来.经过一些研究和实验,我有两个问题:

  1. 在片段中显着重写/修饰模板标记似乎存在相当大的倾向.
  2. 表单似乎不使用有效或可识别的html元素.

我的基础是:

表单示例/文档似乎都是关于特殊提升:标签.Exploring Lift 表示表单应如下所示:(http://exploring.liftweb.net/master/index-6.html)

<lift:Ledger.add form="POST">
  <entry:description />
  <entry:amount /><br />
  <entry:submit />
</lift:Ledger.add>
Run Code Online (Sandbox Code Playgroud)

我不确定它甚至是有效的html5,虽然它可能是有效的xhtml,但它并不觉得这符合我们的设计师朋友让你的模板看起来像真正的HTML的精神.我在其他地方读了(再也找不到了)我们确实可以选择使用实际的输入标签,但是我们不会得到Lift的花哨形式的某些部分,或者某些,这段话不是很清楚关于我究竟错过了什么,这些例子似乎对我写一个简单的html表单并制作简单的html帖子感兴趣.

demo.liftweb.net示例(1)的代码表明您的模板应如下所示(2)

<lift:surround with="default" at="content">
  <div class="lift:PersonScreen"></div>
</lift:surround>
Run Code Online (Sandbox Code Playgroud)

PersonScreen片段的代码也不完全是有启发性的(3).还有一些模板的其他示例,例如,在特定位置只有一个ul标签,只能在片段中生成一系列具有嵌套元素的复杂li.当然,你可以在Scala中使用xml并且它可以读取,但它仍然在各处分散你的标记.这似乎违反了"设计师友好模板"的精神.

我想要了解什么.

很长一段时间我在webapp开发中严格遵循两条规则:

  1. "代码"(控制器,商业模式)中没有标记.
  2. 模板中没有任何业务逻辑.

Idiomatic Lift似乎完全放弃了第一条规则,完全错过了第二条规则的价值.这些规则对我很有帮助,我还没准备好跟随那些似乎违反这些规则的例子而不理解为什么它不会造成混乱.我想了解为什么在Lift中可以在Snippets中生成如此多的显示代码.我也想了解为什么模板中的标记很少反映输出.

我(我想)想要的是什么:

我希望我的所有标记都有很少的(如果有的话)异常存在于我的模板中.我希望我的代码段能够进行最小的模板修改,通常只替换"leaf"标签上的元素文本,并可能调整属性值.我想我已经为一个相当复杂的显示示例做了这个,我怀疑我可以使用相同的技术生成一个vanilla html表单然后自己处理params.如果我希望我的模板看起来像最终结果表单那么我需要做什么?

回应和任何其他想法,尤其是了解有关这些东西的Lift心态,将非常感激.

谢谢!

  1. http://demo.liftweb.net/simple_screen?F674431078927QJVVYD=_
  2. https://github.com/lift/examples/blob/master/combo/example/src/main/webapp/simple_screen.html
  3. https://github.com/lift/examples/blob/master/combo/example/src/main/scala/net/liftweb/example/snippet/Wizard.scala#L94

编辑

回应@ OXMO456.(感谢您的回复.)

我有,他们似乎只是证实了我的担忧:例如我们开始:

提升模板不包含可执行代码.它们是纯粹的,原始的,有效的HTML.

太棒了.然后呢:

后两种调用代码片段的机制不会产生有效的Html5模板.

然而每个人似乎都使用这两种机制中的第一种.还说,它说:

第三,设计人员不必担心学习编程任何东西以便设计HTML页面,因为程序执行是从HTML中抽象而不是嵌入HTML中.

但非常一致的是,我在OP中引用的示例片段完全以编程方式生成标记.这似乎与设计友好模板的目标(a)背道而驰,因此设计人员不必担心Freemarker标记和(b)将显示逻辑与业务逻辑分离.

第二个链接很有帮助,也很有启发性,但很明显这不是The Lift Way.然而,The Lift Way似乎也将标记生成的整个负载拖入片段,这是(我认为)标记和业务逻辑的巨大复合.是电梯之路吗?

Bil*_*ill 18

这些是旧式标签,而不是设计师友好的标签.

<lift:MySnippet>
  <b:field />
</lift:MySnippet>
Run Code Online (Sandbox Code Playgroud)

<div class="lift:MySnippet">
  <div class="field"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

旧式Lift模板是有效的XML,而不是XHTML - 所以你不能拥有未封闭的标签或任何东西 - 这将Lift与大多数框架区分开来,大多数框架将模板视为原始字符串,其中包含整个代码,而不考虑标签或结构.

顺便说一句,在旧式标签中,这些字段都是伪造的 - 它们不是一些标准的Lift标签集的一部分.我可以轻松地做到:

<lift:MySnippet>
  <frobnicate:blorb />
</lift:MySnippet>
Run Code Online (Sandbox Code Playgroud)

只要我的代码段代码正在查找该特定代码.

Lift不允许模板中的任何逻辑.所有逻辑都发生在Snippet类中.因此,对于上面的设计师友好示例,我可能有一个这样的代码段类:

 class MySnippet { 
   def render(in: NodeSeq): NodeSeq = ".field" #> Text("some text here")
 }
Run Code Online (Sandbox Code Playgroud)

这将产生这样的结果:

 <div>
   <div class="field">some text here</div>
 </div>
Run Code Online (Sandbox Code Playgroud)

在Lift模板中放置任何逻辑都是不可能的 - 他们所能做的就是调用Lift片段,它是所有工作都在的常规Scala类.

Lift会丢弃您的实际代码中不应包含任何显示逻辑的规则.为什么?因为它提供了更多可重用的代码,因为Scala具有强大的XML支持,并且因为您的所有逻辑现在都被视为普通的旧Scala代码.

如果我定义一个名为的Lift片段CurrentTime,我可以简单地将其放入任何模板中并显示当前时间 - 使用旧式MVC框架,每个操作方法需要将时间设置为页面变量,然后我的模板需要被修改以打印出来.对于更复杂的逻辑,旧式框架可能需要模板中的条件.Lift不允许这样做 - 所有逻辑都是常规的Scala代码,符合重构要求,易于测试,并且与现代IDE兼容.

  • 很好的答案.然而,Lift的模板机制是Lisp上的一个变种(非常冗长)......因此可以添加一些片段,这些片段可以使Lift的模板机制图灵完成......但sssshhhh ......不要告诉任何人.;-) (4认同)