Skip to content

Latest commit

 

History

History
138 lines (101 loc) · 4.31 KB

10.6.模板.md

File metadata and controls

138 lines (101 loc) · 4.31 KB

10.6.模板

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 详细了解它的方法。