2012-06-01 33 views
2

Play 2.0使用基於自定義scala的模板引擎,允許在html代碼中使用scala子集。爲什麼Playframework 2使用自定義的Scala模板引擎而不是以xml模式構建的scalas?

爲什麼做這個設計決定而不是使用scalas build-in xml模式?

該劇模板引擎有一個像

  • 一些缺點只支持斯卡拉的一個子集,例如,它似乎沒有可以定義的功能函數內部
  • 在Eclipse
  • 沒有編輯器支持

另一方面,據我所知,play scala模板引擎支持格式不正確的html,這在scalas xml模式下是不可能的,但我想應該總是可以將模板寫在一個井中成形的方式。我只是一名初學者,只是想了解背景。

回答

1

我認爲它有幾個答案:

  1. 這是一個模板。模板不應該包含複雜的邏輯。所有的邏輯操作必須在控制器/模型中完成。

  2. 模板可以包含任何您想要的格式:電子郵件,CSV,SQL等。將模板限制爲有效的XML確實限制了框架的可能性。

  3. 一切都是可編譯的。即使路由,資產,模板繼承等等。爲了使這些機制與框架的其餘部分一起工作,可能需要做出一些選擇。但是沒有人能比框架的創造者更好地回答你。

+0

to 1)我完全同意模板不應該包含太多的邏輯,但有時候很好,即使是短的代碼部分,所以這個決定應該留給程序員。 – user536322

+0

到2)這是一個很好的觀點。另一方面,我估計80%的實際案例都需要html或xml。另外的19%可能是json,並提供比模板更好的方式。對於其餘的(csv,sql,...),其他方式可能更適合csv庫,對於0.1%的用例,其中一個realy需要非常特殊和複雜的基於文本的模板,我想這可以使用另一個播放模板引擎模塊。 – user536322

+0

到3)scala支持我猜 – user536322

1

其中一個原因可能是在scala中xml屬性的笨拙處理。有兩個問題:

  1. 屬性如「選擇」,其必須是存在或不存在
  2. 添加屬性的列表來動態等的輸入輔助模板

在平原的一個例子的htmlArgs斯卡拉顯示的困難:

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) 
    } 
    } 
相關問題