2

Play 2.0 使用自定义的基于 scala 的模板引擎,允许在 html 代码中使用 scala 的子集。

为什么做出这个设计决定而不是使用 scalas 内置 xml 模式?

播放模板引擎有一些缺点,例如

  • 仅支持 scala 的一个子集,例如似乎无法在函数内部定义函数
  • eclipse中没有编辑器支持

另一方面,我知道 play scala 模板引擎支持非格式良好的 html,这在 scalas xml 模式下是不可能的,但我想应该总是可以以格式良好的方式编写模板。我只是 play 和 scala 的初学者,只是想了解上下文。

4

2 回答 2

1

一个原因可能是 scala 中 xml 中属性的笨拙处理。有两个问题:

  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 回答