2

hello scalate の例がありますが、単純すぎて学習できません。インテジラットがどのようにリフトとスケーリングを行うのか知りたいです。たとえば、リフト コメット、リフト フォームなどです。

4

3 に答える 3

1

Lift scalate モジュール (2.5) の現在の具体化は (スニペットとコメットとの統合という意味で) 機能しないことが判明しました。問題は、scalate モジュールが、完了した応答を生成するものとして scalate レンダラーをパイプラインに入れることです。

したがって、scaml ファイルはレンダリングされますが、リフト タグはサポートされません。

本当に欲しいものを手に入れるには、テンプレート ローダーをハックする必要があります (幸いなことに、Lift で実行できます)。

私はこれで少し遊んで、モジュールからコードを少し切り取った。これは私にとってはうまくいきます(ただし、テンプレートのキャッシュ、ロケールのサポート、開発モードと本番モード、おそらくいくつかの構成パラメーターなど、多くのことが必要です(たとえば、本番モードでは、毎回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>
}
于 2013-02-10T06:29:58.480 に答える
0

他のリフトテンプレートメカニズムと同じ方法です。

スニペットを呼び出すことができます:

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

そしてCometは単なるスニペットです:

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

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

于 2011-03-28T04:18:02.310 に答える
0

あなたはこのpdfでそれらの多くを見つけるでしょう

于 2011-10-19T12:50:26.497 に答える