Scala templates syntax[翻译]

原文:Scala templates syntax

模板引擎

基于Scala类型安全的模板引擎

Play自带有 Twirl,这是一个强大的基于Scala的模板引擎,它的设计灵感来自ASP.NET Razor,更具体的说是:

  • 简洁, 富有表现力, 和流畅: 它把字符的数量和在文件中点击键盘的需求降至最低,并且实现了快速,流畅的编程工作流。不像大多数模板语法,你完全不需要为了在HTML代码中明确表示服务端的语句块,而中断你的编码。足够聪明的解析器可以从你的代码中推断出这点。这让这个真正的紧凑并富有表现力的语法变的简洁,快速和有趣。
  • 易于学习:它可以让你用最少的概念,快速的提高效率。你可以使用简单的Scala结构和所有你会的HTML技能。
  • 不是一个新的语音:我们自觉的没有创建一个新的语言,相反,我想让Scala开发人员可以使用他们已有的Scala语音技能,并提供一个模板标记语法,让完美的HTML构建工作流成为可能。
  • 可在任何文本编辑器中编辑:它不需要一个特殊的工具,可以让你在任何普通的旧文本编辑器中提高效率。

模板是可以被编译的,因此你可以在你的浏览器中看到任何错误:

概述

Play的scala模板是一个包含了小的Scala代码块的简单的文本文件。模板可以生成任何基于文本的格式,如HTML,XML或者CSV。

模板系统的设计,让使用HTML的人感到舒服,让前端开发者很容易的使用模板。

模板是被做为标准的Scala函数编译的,遵循简单的命名规范。如果你创建iews/Application/index.scala.html 模板文件,它将会生成有 apply方法的views.html.Application.index类。

例如,这是一个简单的模板:

@(customer: Customer, orders: List[Order])

<h1>Welcome @customer.name!</h1>

<ul>
@for(order <- orders) {
<li>@order.title</li>
}
</ul>

然后你就可以从任何Scala代码中调用这个,就像一般你调用类的方法:

val content = views.html.Application.index(c, o)

语法:不可思议的 ‘@’字符

Scala模板使用 @ 做为单独的特殊字符。每次遇到这个字符,就表示动态语句的开始。你不需要显式的关闭代码块——将会从你的代码中推断动态语句的结束:

Hello @customer.name!
^^^^^^^^^^^^^
Dynamic code

由于模板引擎自动的通过分析你的代码,探测你的代码块的结束,因此这个语法只支持简单的语句。如果你想插入多令牌语句,就要使用括号显式的标记出来:

Hello @(customer.firstName + customer.lastName)!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Dynamic Code

你可以可以使用大括号,写多语句块:

Hello @{val name = customer.firstName + customer.lastName; name}!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Dynamic Code

由于@ 是一个特殊的字符,因此有时可以用@@来转义它:

My email is bob@@example.com

模板参数

一个模板就像一个方法,因此它也需要参数,参数必须在模板文件的顶部声明:

@(customer: Customer, orders: List[Order])

你也可以对参数使用默认值:

@(title: String = "Home")

或者甚至是多个参数组:

@(title: String)(body: Html)

迭代

可以以标准的方式使用for关键字:

<ul>
@for(p <- products) {
<li>@p.name ($@p.price)</li>
}
</ul>

注意:确保{和for在同一行,来表示表达式继续到下一行。

If-blocks

If-blocks 没有什么特别的地方。简单的使用Scala标准的if语句:

@if(items.isEmpty) {
<h1>Nothing to display</h1>
} else {
<h1>@items.size items!</h1>
}

声明可复用的语句块

你可以创建可复用的代码块:

@display(product: Product) = {
@product.name ($@product.price)
}

<ul>
@for(product <- products) {
@display(product)
}
</ul>

注意你也可以声明一个可复用的纯代码块:

@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}

<h1>@title("hello world")</h1>

注意:用这种方式在模板中声明代码块有时有用,但是要记住模板不是写复杂逻辑的最佳地方。往往更好的方式的在Scala类(如果你想写,你可以存储在 views/包下)中写这样的代码。

按照规范,以implicit 开始的命名的可复用的代码块将被标记为 implicit:

@implicitFieldConstructor = @{ MyFieldConstructor() }

声明可复用的值

你可以使用defining 助手定义值的作用域:

@defining(user.firstName + " " + user.lastName) { fullName =>
<div>Hello @fullName</div>
}

导入语句

你可以在模板(或子模板)的开头导入任何你想要的类:

@(customer: Customer, orders: List[Order])

@import utils._

...

为了避免意外, 在导入语句中使用root 语法:

@import _root_.company.product.core._

如果你需要在所有的模板中导入常用的导入,你可以在 build.sbt文件中声明:

TwirlKeys.templateImports += "org.abc.backend._"

注释

你可以在模板中使用 @* *@写服务端的注释块:

@*********************
* This is a comment *
*********************@

你可以在第一行放一段注释把你的模板记录进Scala API文档:

@*************************************
* Home page. *
* *
* @param msg The message to display *
*************************************@
@(msg: String)

<h1>@msg</h1>

转义

默认情况下,动态部分的内容会根据模板类型(如HTML或XML)的规则被转义。如果你想输出一个原生的内容段,并把它封装进模板内容类型。例如输出原生的HTML:

<p>
@Html(article.content)
</p>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容