Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates Scala/Lift-试图理解Lift';s同时声称在render中使用有效的html和lift:tags和tag重写的倾向_Templates_Html_Scala_Xhtml_Lift - Fatal编程技术网

Templates Scala/Lift-试图理解Lift';s同时声称在render中使用有效的html和lift:tags和tag重写的倾向

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。探索电梯意味着一个窗体应该是这样的:() 我甚至不确定

所有这七件事()当然都很好,但我对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中,在代码片段中生成这么多显示代码是可以的。我还想理解为什么模板中的标记很少反映输出是可以的

    我(认为我)想要的:

    我希望我所有的标记都包含在模板中,即使有例外,也很少。我想让我的代码片段尽可能少地破坏模板,通常只替换“叶”标记上的元素文本,并可能调整属性值。我想我已经为一个相当复杂的显示示例完成了这项工作,我怀疑我可以使用相同的技术生成一个普通的html表单,然后自己处理参数。如果我想让我的模板看起来像最终结果表单,这就是我需要做的吗

    非常感谢您的回复和其他想法,尤其是关于理解关于这件事的提升心态

    谢谢

  • 编辑 回应@OXMO456。(感谢您的回复。)

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

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

    太棒了。随后:

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

    但似乎每个人都在使用这两种机制中的第一种。此外,它还说:

    第三,设计者不必担心为了设计HTML页面而学习编写任何程序,因为程序的执行是从HTML中抽象出来的,而不是嵌入到HTML中

    但是,与我在OP中引用的示例片段一样,这些示例片段完全是以编程方式生成标记的。这似乎与以下目标背道而驰:(a)拥有设计师友好的模板,这样设计师就不必为Freemarker标记而烦恼;(b)将显示逻辑与业务逻辑分离


    第二个环节很有帮助,也很有启发性,但它清楚地表明,这不是提升方式。然而,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>