🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
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). ~~~ ## 模板宏 当部分模板被渲染时要调用自定义的函数,提供一个 宏对象到 Template.execute 的参数即可。键会作为模板变量名,值引用一个应该返回字符串的回调函数。这个宏函数的第一个参数总是一个 resolve() 方法,后跟指定的参数。 resolve 函数可以被调用来从模板上下文中取回值。如果宏没有这个字段,结果将是未指定的。 下面的例子传递它本身作为宏函数上下文,并从模板执行 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 详细了解它的方法。