微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模板 – Scala / Lift – 试图了解Lift同时声称使用有效的html和lift的倾向:标签和标签重写在渲染

所有的七件事( http://seventhings.liftweb.net/)都是不错的,但是对“模板”( http://seventhings.liftweb.net/templates)中的“电梯支持设计师友好模板”的要求尤其热烈.

作为我在学习Lift的方法之一的步骤之一,我试图创建一个简单的对象创建表单:采取几个参数,将它们用作构造函数参数,然后将对象存放.经过一番研究和实验,我有两点担忧:

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

我以这个为基础:

表单示例/文档似乎都是关于特殊电梯:标签.探索电梯表明一个表单应该如下所示:(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=_
> https://github.com/lift/examples/blob/master/combo/example/src/main/webapp/simple_screen.html
> https://github.com/lift/examples/blob/master/combo/example/src/main/scala/net/liftweb/example/snippet/Wizard.scala#L94

编辑

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

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

Lift templates contain no executable code. They are pure,raw,valid HTML.

这是真棒.后来呢

The latter two mechanisms for invoking snippets will not result in valid Html5 templates.

而且每个人似乎都使用了这两个机制中的第一个.另外,它说:

Third,the designers don’t have to worry about learning to program anything in order to design HTML pages because the program execution is abstracted away from the HTML rather than embedded in the HTML.

但是非常一致的例子中,我在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兼容.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐