2013-06-29 25 views
4

爲什麼在playframework 2(scala)中使用scala template-engine如果我們可能只停留在scala爲什麼在playframework 2(scala)中使用模板引擎,如果我們可能保持純scala

使用模板引擎是:

  • 額外的處理器時間變換模板語法成階代碼
  • 然後編譯該代碼(這是不那麼簡潔彷彿由手寫 - 然後它編譯更慢)
  • 此外,如果模板不是從你的主代碼尚未轉化成階,你可以看到,代碼不一致(紅色高亮顯示在你的IDE) - 所以你應該每次想想..

爲什麼不直接使用核心XML/HTML支持提供喜歡這裏什麼scalahttp://www.scala-lang.org/node/131

有沒有純Scala的模板(可以推薦)我可以在play-framework或單獨使用?

回答

2

對我來說,這適合 作爲答案,至少對於最後一個問題。

這只是scala。只需XML內置的魔力。

http://www.alvarocarrasco.com/2011/03/play-framework-and-templating-with.html?m=1

樣品:

這是一個模板:Templates.scala文件

package templates 

import play.api.templates.Html 
import scala.xml.Xhtml 
import controllers.routes 

object Main { 

    def page (title:String="Default title")(content: => scala.xml.Elem) = Html { 
    "<!DOCTYPE html>" + 
     Xhtml.toXhtml(
     <html> 
      <head> 
      <title>{title}</title> 
      <link rel="stylesheet" media="screen" href={routes.Assets.at("stylesheets/main.css").toString()} /> 
      <link rel="shortcut icon" type="image/png" href={routes.Assets.at("images/favicon.png").toString()} /> 
      <script src={routes.Assets.at("javascripts/jquery-1.9.0.min.js").toString()} type="text/javascript" /> 
      </head> 
      <body> 
      {content} 
      </body> 
     </html> 
    ) 
    } 

    // a panel template, just as an example 
    def panel (label:String="Some label")(content: => scala.xml.Elem) = { 
    <div class="panel"> 
     <div class="panel-label">{label}</div> 
     <div>{content}</div> 
    </div> 
    } 
} 

這是一個索引頁 index.scala文件

package views 

import templates.Main._ 

object IndexPage { 

    def apply() = { 

    page(title="Welcome to my Page!") { 

     <div> 
     <h1>Hello</h1> 

     <p>Some template markup</p> 

     { 
      panel(label="Dashboard panel")(
      <div> 
       Panel content 
      </div> 
     ) 
     } 

     </div> 
    } 
    } 

} 

這是一個控制器: Application.scala文件

package controllers 

import play.api.mvc._ 

object Application extends Controller { 

    def index = Action { 
    Ok(

     views.IndexPage() 

    ); 
    } 

} 
3

其實你應該問這個問題給開發團隊,但是考慮幾點:

  • 其實你並不需要在所有使用Play的模板引擎,你可以很容易地Ok()方法返回的任何字符串,所以根據你的鏈接,你可以做一些像Ok(theDate("John Doe").toString())
  • 播放使用其他MVC網絡框架非常典型的方法,其中視圖是基於HTML的文件,因爲......它是網絡專用框架。我看不出有什麼錯,有時我正在使用其他語言/框架,並且可以看到它們之間的視圖差異僅僅是語言特定的語法,這就是目標!
  • 不要忘了,Play是雙語系統,有人可能會問'爲什麼不使用一些Java lib來處理視圖?'
  • 內置的Scala XML文字不適合創建複雜的程序,您很容易遇到問題(這也是爲什麼有一個名爲anti-xml的庫);馬丁Odersky本人很遺憾使這一語言功能
  • 最後,有IDE支持播放2視圖,我正在與Play2支持的理念12,雖然它不完美(這是相當新的,所以有時有小問題)在大多數情況下,它工作正常。它理解玩視圖的語法,提供自動完成,甚至可以使用選項+在視圖中單擊某個對象,直接跳轉到該方法/模型的聲明等。

回答你的最後一個問題,據我所知正式有Groovy engine available作爲一個模塊,它提供了Play 1.x中已知的模板引擎,但是請記住,它僅僅是人們從Play 1.x遷移到Play 2.x的橋樑,因爲它只比播放Play 2的原生引擎慢。

+1

很好的總結,可以補充Scala的XML文本不適合創建複雜的程序和馬丁·奧德斯基自己認爲他們在事後一個錯誤是非常有用的。 –

+0

@MariusSoutier好點,你可以加我的答案嗎? – biesior

+2

有一個建議我已經得到:https://github.com/lihaoyi/scalatags (我會使用谷歌組[有時我使用/轉貼有問題],但它不是很酷作爲stackoverflow。) – ses

相關問題