Field其实很简单
我们可以将Field作为一个supertag中的字段或者属性。在这个字段中,可以存储一些固定的信息。Field就是这个信息的‘坑位’。你也可以将它想象成为一个Excel数据表中的列。
关于supertag,它的基础是其实还是一个tag,而你愿意将什么定义为tag并没有一定之规。看你自身笔记‘系统’的需要,也看你自己喜欢怎样的笔记管理理论。这里不对笔记系统本身做好坏优劣的评价,自认为只有最适合自己的,没有最好的。
说回Field,如果你将#people作为一个tag(在Tana中是supertag),那么people在这里作为一个对象,people可以有以下几个 属性 或者 列(这里可以想象Excel表格):
- Name(姓名):表示人的名称,为字符串类型。
- Age(年龄):表示人的年龄,为整数类型。
- Gender(性别):表示人的性别,可以为字符串类型,如"male"代表男性,"female"代表女性。
- Occupation(职业):表示人的职业,为字符串类型。
- Address(地址):表示人的居住地址,也为字符串类型。

使用方式上,作为一个属性存在的Field本身不应该存储过多的信息,它只是用来存储对象的属性,一些少量的描述性的信息,它和节点(node)是不同的。从功能上来说,Field和Node没有太多不同,但并不建议在Field中录入太多信息。
Field包括哪些部分
一个Field由三个部分构成:
- 字段名称(Field Name) - 添加字段时候输入的名称
- 字段描述(Add a description) - 在名称下面可以添加对于本字段的描述
- 字段类型(Field Type) - 有文本(Plain)、选项(Options)、实例(Options from supertag)、日期(Date)、数字(Number)、超链接(Url)、邮箱(Email)、选择(Checkbox)

如何区分Field与supertag
一个比较流行的做法是,Field被认为是一种属性,一个对象的特征。而Supertag被认为是一个对象。
例如,“人”,是一个对象,“人”是一个suptertag;而“人”有姓名,年龄,性别等属性,那么姓名,年龄,性别,身高,体重,兴趣爱好…等就可被认为是Field了。
为了区分tag和Field,我习惯将所有的tag全部用小写开头,所有的Field用大写开头。以便今后一眼就可以知道它是我设定的tag还是只是一个Field。
Field参与的功能
Field作为Tana中一个基础的模块,其参与了大多数或简单或复杂的功能。主要有以下两个方面:
- Field可以与Supertag组合使用,作为Supertag的一个属性;
- 被用作搜索的条件;
Field可以是Supertag的一个属性
Field可以是Supertag的一个属性,也可以在任一位置新建一个独立的Field。在supertag的table视图中,可以看到#people这个supertag的各种“属性”(Field)。你可以利用这个属性,在不同的视图中和Field组合实现多种展现形式和过滤方式。

Field与搜索功能
建立一个搜索节点(Searching Node - 在node位置如数英文的?即可触发新建)

在Tana的官方文档中,对Search Node的各类可以参与的[对象类型(Operator)]进行了说明如下:
| 操作符 | 描述 | Linter |
|---|---|---|
| @(引用) | 插入一个引用将仅返回该引用的后代节点。提示:引用一个工作区以限制结果只在该工作区中的节点。 | DescendantOf:nodeName |
| supertag(超级标签) | 插入一个超级标签(suptertag)引用将仅返回该超级标签的实例。输入#和超级标签列表将弹出。 | Tag:tagName |
| Field(字段) | 插入一个字段(Field)定义将仅返回设置了该字段及其值的节点。 | hasField:fieldName |
| 含一个或多个值的字段 | 在字段中插入一个或多个纯文本或引用值将返回包含这些值中任何一个的具有该字段的节点。 | fieldName==Hello world |
| 纯文本的Node | 插入非引用的纯文本节点将返回与文本匹配的节点。 | StringMatch: "hello world" |
| 有日期的节点 | 插入日期将返回名称包含日期的节点 | DateWithin:date DateWithin:日期 |
| 介于 /.../ 之间的正则表达式 | 在两个正斜线之间插入正则表达式,将返回与正则表达式匹配的节点。 | RegexpMatch:/yourRegEx/ |
在Supertag中添加Field
新建一个Supertag后,按住⌘+⇧的同时点击Supertag的标签,可以直接打开其配置面板。这个时候你可在这里新建Field。这应该是最常见的方式。你可以通过直接敲入一个 < 符号后,输入Field名称。

但是这有一个问题,默认的Filed类型都是Plain Text类型。之后你需要在后续步骤中(按住⌘+⇧的同时点击Field的标签),进一步选择Field类型。

或者,你可敲入 / 后,在弹出的菜单中选择Field,进一步在下级菜单中直接选择Field类型,一次完成。

又或者,你可直接点击New field 按钮来添加,也会弹出下级菜单并可直接选择Field类型,一次完成。

我个人比较习惯于输入 < 符号的方式,完全是习惯的原因。
Field的存放位置
我开始很少会去注意Filed的存放位置,直到我后面开始不断的应用Search node(曾经叫Live search)进行略复杂的查找、过滤和筛选的时候才发现问题。当然,它还会影响诸如自动初始化的功能。
先说结论,将Field哪里看需要,没有标准。下面通过一个简单的关于Field自动初始化(Auto-initialize)的例子(后文会具体展开讲此类功能)来说明。在早期的Tana版本中,Field放在supertag之下,当一个supertag要引用另一个supertag的时候会找不到,结果导致用户在不同supertag之下建立了许多同名的Field,而诸如自动初始化这样的功能又要求必须引用同一个Field而不只是同名,所以导致不少用户失败。后文所有可实现自动初始化的原因在于是同一个Field(要么来自于一个supertag之下,要么来自于同一个Workspace的Schema页面之下)。
在新版本的Tana中,当用户尝试新建一个同名的Field时候,系统会提示是否是引用在另一个supertag之下的同一个Field,这很大程度上避免了上述错误。

但个人使用的建议依然是,要好好利用你的Schema页面,如果你想建立一个好用的笔记“系统”的话,一个整齐的,逻辑结构清晰的Schema是你后期好好维护的关键。因此如果一个Field是常用且相对具体的,例如Author,Singer,建议依然放在Schema之下,这样方便在各处调用。

Field自动初始化(Auto-initialize)
所谓Filed的自动初始化(Auto-initialize),是Field的值无需手动输入,它可以在新建的时候,自动初始化一个值。这个值来自当前node的上级节点(node nested above)对应的Field的值(两个Field的Field name需要完全相同)。这里面有三层意思:
- 只有当新建node的时候才有效果。已经建立好的node,不会因为你大打开这个功能,或者修改了上级node的对应Field的值而修改其下级节点对应的Field的值。
- 初始化意味着,这只是最开始的初始值,是可修改的。而且以你修改的为准。也是为什么有上面的第一点。否则当用户修改了值之后,只要上级节点的某个信息修改了,下级节点的Field自动被改变,这不是初始化的意思,而变成了关联或链接。
- 上级节点意味着,它不仅可以是父节点(Parent node)它可以是Grand parent node,只要是来自上级节点,有对应的Field Name(需要完全一致)即可以实现对应值向下级节点的自动初始化。

另外, 当上级节点有多个相同的Field时,自动初始化的值为最新的那一个node。

下面举例实现自动初始化(Auto-initialize)的方式。
自动初始化(Auto-initialize)操作举例
- 步骤1:新建
#school,#class,#student,三个Supertag。三个supertag的对象具有一定的层级关系。其中#school和#class只包括名称SchoolName、ClassName。而#student则包括学生姓名,年龄,地址等一系列Field。

- 步骤2:
#school,#class分别配置ClassName、SchoolName,两个Field,类型均为String/Plain text。并打开ClassName的自动初始化(Auto-initialize)开关。(::由于SchoolName已经是我们设计中的最上层,因此打开不打开是没有区别的,下图仅演示ClassName打开Auto-initialize位置,SchoolName同理)

- 步骤3: 编辑
#class,在Field中输入<添加Field,我希望在每个班级新建的时候,可以自动引用其上级节点的SchoolName,而不必自己手动输入。于此我在此输入Scho..,你会发现当你开始输入的时候,新版的Tana会自动提示,问你是否要引用别的suptertag下的相同Field。

- 步骤4:在
#student中,点击Extend from按钮,直接引用#class。这样会看到下方出现两个#class采用的两个Field:即SchoolName和ClassName

至此,新建#studentnode时,其引用的SchoolName和ClassName会自动查找其上级节点是否存在同一个Field,如果有,则自动初始化。注意,这里class和school并没有包含关系,它们是完全平行的两个supertag,而自动初始化的逻辑很简单,它只是向上查找,找到举例最近的且同一个的Field,然后引用其值而已。


