Haxe 附带了一个标准的模板系统,使用被一个轻量的 haxe.Template 类解释的简单的语法。
模板是一个字符串或者一个文件,用来产生任何种类的取决于输入内容的字符串输出。这是一个小的模板例子:
class Main {
static function main() {
var sample = "My name is <strong>::name::</strong>, <em>::age::</em> years old";
var user = {name:"Mark", age:30};
var template = new haxe.Template(sample);
var output = template.execute(user);
trace(output);
}
}
控制台会输出 :The console will trace My name is Mark, 30 years old.
::name::
变量名::expr.field::
字段访问::(expr)::
表达式 expr 被评估::(e1 op e2)::
对 e1 和 e2 应用操作符 op::(135)::
整数 135 。Float类型常量是不允许的
可以使用 ::if flag1::
测试条件。可选地,条件可以使用 ::elseif flag2::
或者 ::else::
。关闭条件使用 ::end::
。
::if isValid:: valid ::else:: invalid ::end::
运算符可以被使用,但是不处理运算符优先级。因此需要需要把每个操作放入括号 ()
。目前,如下的运算符被允许:+
,-
,*
,/
,>
,<
,>=
,<=
,==
,!=
,&&
,和 ||
。
例如,::((1 + 3) == (2 + 2))::
会显示 true 。
::if (points == 10):: Great! ::end::
要比较一个字符串,使用双引号 " 到模板中。
::if (name == "Mark"):: Hi Mark ::end::
通过使用 ::foreach::
迭代一个结构。结束循环使用 ::end::
。
<table>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
::foreach users::
<tr>
<td>::name::</td>
<td>::age::</td>
</tr>
::end::
</table>
要在一个模板中包括另一个模板,传递子模板结果字符串作为一个参数。
var users = [{name:"Mark", age:30}, {name:"John", age:45}];
var userTemplate = new haxe.Template("::foreach users:: ::name::(::age::) ::end::");
var userOutput = userTemplate.execute({users: users});
var template = new haxe.Template("The users are ::users::");
var output = template.execute({users: userOutput});
trace(output);
控制台会输出 :The users are Mark(30) John(45).
当部分模板被渲染时要调用自定义的函数,提供一个 宏(macros)
对象到 Template.execute 的参数即可。键会作为模板变量名,值引用一个应该返回 String
的回调函数。这个宏函数的第一个参数总是一个 resolve()
方法,后跟指定的参数。 resolve 函数可以被调用来从模板上下文中取回值。如果 macros
没有这个字段,结果将是未指定的。
下面的例子传递它本身作为宏函数上下文,并从模板执行 display
:
class Main {
static function main() {
new Main();
}
public function new() {
var user = {name:"Mark", distance:3500};
var sample = "The results: $$display(::user::,::time::)";
var template = new haxe.Template(sample);
var output = template.execute({user:user, time: 15}, this);
trace(output);
}
function display(resolve:String->Dynamic, user:User, time:Int) {
return user.name + " ran " + (user.distance/1000) + " kilometers in " + time + " minutes";
}
}
typedef User = {name:String, distance:Int}
控制台会输出如下结果:Mark ran 3.5 kilometers in 15 minutes.
使用 Template.globals 对象来存储可以被贯穿整个 haxe.Template
实例中应用的值。它的优先级低于 Template.execute
的上下文参数。
要从代码中分离内容,考虑使用资源嵌入系统(第8.4节)。存放模板内容到一个新的文档,叫做 sample.mtt
,添加 -resource sample.mtt@my_sample
到编译器参数,使用 haxe.Resource.getString
来检索内容。
class Main {
static function main() {
var sample = haxe.Resource.getString("my_sample");
var user = {name:"Mark", age:30};
var template = new haxe.Template(sample);
var output = template.execute(user);
trace(output);
}
}
当在服务端运行模板系统,你可以简单的使用 neko.Lib.print
或者 php.Lib.print
,而不是使用 trace 来显示 HTML 模板给用户。
查看 Template API 详细了解它的方法。