【问题标题】:Is there are any lift + scalate full example?有没有lift + scalate完整的例子?
【发布时间】:2011-03-26 16:54:20
【问题描述】:

有hello scalate的例子,但是学起来太简单了。 我想知道如何整合升力和升力,例如升力彗星、升力形式...

【问题讨论】:

    标签: scala lift scalate


    【解决方案1】:

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

    因此,您的 scaml 文件将呈现,但它们不支持提升标签。

    要获得您真正想要的东西,您应该侵入模板加载器(幸运的是,Lift 允许您这样做)。

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

    在 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 sn-p 的预期响应:

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

    【讨论】:

      【解决方案2】:

      与任何其他 Lift 模板机制相同。

      可以调用片段:

      <div class="lift:MySnippet">...</div>
      

      Comet 只是一个 sn-p:

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

      https://groups.google.com/d/topic/liftweb/f_zOj3ZOLQg/discussion

      【讨论】:

      • 事实证明,当前存在的 scalate 模块充当了生成响应的调度例程,并绕过了所有真正的提升优势......请参阅我的答案。
      【解决方案3】:

      您会在This pdf 中找到很多内容

      【讨论】:

      • liftweb-master.pdf 没有任何与 scalate 相关的内容
      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2014-09-10
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多