本节将介绍 FreeMaker 中的数据模型,理解好数据模型对熟练使用 FreeMaker 非常重要。
您可能一听到“数据模型”会感觉很高深,其实不然;下面通过一个JSON让你来理解 FreeMaker 的数据模型,如下图:
上图中,其实就是一个 JSON 对象;如果你使用可视化工具查看,会发现数据模型就是一棵树(看图左边),这棵树可以非常复杂、非常深(这就需要根据实际的业务需要来调整)。
仔细观察上面JSON对象,会发现存在两种类型的对象:单值对象 和 hash对象。其中 “message”、“foo”、“size”、“price”这些key就是单值,因为它们后面直接就是我们需要的实际数据,如:字符串、数字等。而hash对象则是将很多单值对象收拢在一起,然后给它们取个名字,你就可以使用“名字.key”的方式去访问了。如:“misc”、“animals”、“mouse”、“elephant”、“python”就是hash对象,其中 animals 是 hash 对象中放 hash对象。因此,想访问 “mouse”的 “price”你需要使用。
注意:上面还有一个非常特殊的 hash 对象,它就是“root”;如果要在模板中使用子变量, 那应该从根 root 开始指定它的路径,每级之间用点来分隔开。要访问 mouse 的 price ,要从 root 开始,首先进入到 animals ,之后访问 mouse ,最后访问 price 。就可以这样来写,记住不要将 root 写出来,变成 root.animals.mouse.price
另外还有一个非常有用的对象“序列/数组/列表”。它们像Hash表那样存储子变量,但是子变量没有名字,它们只是列表中的项。 比如,在下图中这个数据模型中, animals 就是序列:
要访问序列的子变量,可以使用方括号形式的数字索引下标。 索引下标从0开始(从0开始也是程序员的传统);那么第一项的索引就是0, 第二项的索引就是1等等。要得到第一个 animals 的 name,可以这么来写代码
到这里 FreeMaker 的数据模型常用三种存储类型您都了解了,这下我们可以构建一个稍微复杂的数据模型。假如我们有一个网站的页面,该页面包含了网站导航栏(头)、各种内容列表、底部版权信息。模型如下:
用 Java 的话说,数据模型就是 Map 嵌套 Map 或 List,然后 List 中 嵌套 Map 或 List(可以嵌套多层)。
数据模型可以被看成是树形结构。
单值对象用于存储单一的值,这种类型的值可以是字符串,数字,日期/时间或者是布尔值。如:name=""
哈希表(Hash)是一种存储变量及其相关且有唯一标识名称的容器。如:person = { name="", age="" };
序列(Sequences)是存储有序变量的容器。存储的变量可以通过数字索引来检索,索引通常从0开始。如:persons = [ { name="", age="" }, { name="", age="" } ]