2

Play 2.0 は、html コード内で scala のサブセットを使用できるカスタムの scala ベースのテンプレート エンジンを使用します。

scala ビルドイン xml モードを使用する代わりに、この設計上の決定がなされたのはなぜですか?

プレイ テンプレート エンジンには、次のようないくつかの欠点があります。

  • scala のサブセットのみがサポートされています。たとえば、関数内で関数を定義することはできないようです。
  • Eclipse ではエディターはサポートされていません

一方、play scala テンプレート エンジンは、scalas xml モードでは不可能な非整形式の html をサポートしていることは理解していますが、整形式の方法でテンプレートを記述することは常に可能であるべきだと思います。私は play と scala の初心者であり、コンテキストを理解したいだけです。

4

2 に答える 2

1

その理由の 1 つは、scala での xml の属性の扱いがぎこちないことかもしれません。2 つの問題があります。

  1. 存在するかどうかのいずれかである必要がある「selected」などの属性
  2. 入力ヘルパー テンプレートの htmlArgs のように動的に属性のリストを追加する

単純なscalaの例は、困難を示しています:

def addAttributes(element: Elem, attributes: Map[Symbol, _ <: Any]): Elem = {
    var el = element
    for ((key, value) <- attributes) el = el % Attribute(None, key.name, Text(value.toString), Null)
    el
  }

  def multiselect[T](field: play.api.data.Field,
    options: Seq[T],
    optionValue: T => String,
    optionText: T => String,
    args: (Symbol, Any)*)(implicit handler: FieldConstructor, lang: play.api.i18n.Lang) = {
    val values = { field.indexes.map { v => field("[" + v + "]").value } }
    input(field, args: _*) {
      (id, name, value, htmlArgs) =>
        Html(
          addAttributes(
            <select id={ id } name={ name } multiple="multiple">
              {
                options.map { v =>
                  val z: Option[String] = if (values contains v) Some("selected") else None
                  <option value={ optionValue(v) } selected={ z map Text }>{ optionText(v) }</option>
                }
              }
            </select>,
            htmlArgs).toString)
    }
  }
于 2012-06-05T10:30:29.830 に答える
1

いくつかの答えがあると思います:

  1. テンプレートです。テンプレートは複雑なロジックを保持することは想定されていません。すべてのロジック操作はコントローラー/モデルで行う必要があります。

  2. テンプレートには、電子メール、CSV、SQL など、任意の形式を使用できます。テンプレートを有効な XML に制限すると、フレームワークの可能性が実際に制限されます。

  3. すべてがコンパイル可能です。ルート、アセット、テンプレートの継承などです。これらのメカニズムがフレームワークの残りの部分と連携するためには、おそらく何らかの選択が必要でした。しかし、フレームワークの作成者ほどあなたにうまく答えることができる人はいません。

于 2012-06-01T15:14:52.623 に答える