Scala 有电梯吗;缩放完整示例?

Scala 有电梯吗;缩放完整示例?,scala,lift,scalate,Scala,Lift,Scalate,有hello scalate示例,但它太简单了,无法学习。 我想知道integirat lift和scalate是如何实现的,例如,lift comet,lift form…与任何其他lift模板机制相同 可以调用代码段: <div class="lift:MySnippet">...</div> 。。。 Comet只是一个片段: <div class="lift:comet?type=MyCometThing">...</div> 。。。

有hello scalate示例,但它太简单了,无法学习。
我想知道integirat lift和scalate是如何实现的,例如,lift comet,lift form…

与任何其他lift模板机制相同

可以调用代码段:

<div class="lift:MySnippet">...</div>
。。。
Comet只是一个片段:

<div class="lift:comet?type=MyCometThing">...</div>
。。。

你会在pdf中找到很多,事实证明,Lift scalate模块(2.5)的当前版本不起作用(在与snippets和comet集成的意义上)。问题是scalate模块将scalate渲染器作为生成完整响应的东西放入管道中

因此,scaml文件将呈现,但它们不支持提升标记

为了得到您真正想要的,您应该侵入模板加载器(幸运的是,Lift允许您这么做)

我玩了一下这个,从模块中提取了一些代码。这对我来说很有用(尽管它需要很多东西,比如模板缓存、语言环境支持、开发模式与生产模式,也许还有一些配置参数(例如,在生产模式下,您希望scalate每次都处理scaml,还是只在初始加载时处理scaml?)

在Boot.scala中:

ScalamdTemplateLoader.init
其中ScalamdTemplateLoader.scala是

... other imports ...
import net.liftmodules.scalate.LiftTemplateEngine

object ScalamdTemplateLoader extends Loggable {
  val renderer = new LiftTemplateEngine
  def init = {
    LiftRules.externalTemplateResolver.default.set(scalateTemplateLoader _)
  }

  protected def createUri(path: List[String], ext: String): String = path.mkString("/") +
    (if (ext.length > 0) "." + ext else "")

  protected def canLoad(v: String): Boolean = {
    renderer.canLoad(v)
  }

  def canRender(path: List[String], ext: String): Boolean = {
    if (ext == "") {
      canLoad(createUri(path, "scaml")) || canLoad(createUri(path, "ssp"))
    } else {
      val uri = createUri(path, ext)
      (uri.endsWith(".ssp") || uri.endsWith(".scaml")) && canLoad(uri)
    }
  }

  def scalateTemplateLoader: PartialFunction[(Locale, List[String]), Box[NodeSeq]] = {
    case (l: Locale, path: List[String]) if (canRender(path, "")) => {
      val uri: String = List("scaml", "ssp").map(createUri(path, _)).find(renderer.canLoad(_)).get
      val rawTemplate = renderer.layout(uri)
      val is = new ByteArrayInputStream(rawTemplate.getBytes("UTF-8"));
      val parserFunction: InputStream => Box[NodeSeq] = S.htmlProperties.htmlParser
      parserFunction(is)
    }
  }
}
大部分代码都是直接从模块中提取的(参见ScalateView…,这会导致LiftResponse)…通过将其作为外部模板加载器放入,并通过S.htmlParser运行,我们最终得到一个模板,该模板被送入整个lift子系统中…scalate被用作lift的模板源,而不是响应源

当我输入这样的模板时:

%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
  %body
    %p Hi there
    %div.crap This is some crap
    %div(class="lift:Demo1.currentTime")
      %p I am having fun at 
      %span.time
我从Demo1片段中得到了预期的响应:

class Demo1 {
  def currentTime(n : NodeSeq) : NodeSeq = <span class="time">{ new Date().toString }</span>
}
classdemo1{
def currentTime(n:NodeSeq):NodeSeq={new Date().toString}
}

事实证明,scalate模块(当前存在)充当一个调度例程,生成响应,并绕过所有真正的提升功能…请参见我的答案。liftweb-master.pdf与scalate没有任何关系