Netless 白板支持多场景。基于多场景,我们可以设计多页白板功能、PPT 演讲功能。
单独的场景是一个向四周无限延伸的广袤空间,用户可以在这个空间上写字、插入图片,也可以插入 PPT 的某一页。我们可以在一个房间内构造多个场景,并在不同场景之间切换。这种切换,视觉上就像是在「切页」,因此,业务上,我们可以将「场景」视为「页面」。
如果我们希望展示一个 20 页的 PPT,我们可以在一个白板房间内构造 20 个场景,在每个场景中放置一页 PPT 内容以供展示。通过切换场景,我们就做到了类似 PPT 切页的效果。
白板的房间里可以有一个或多个场景。每一个时刻,仅能展示这些场景中的某一个。你可以通过 SDK 的 API 对场景进行增、删、改、查操作。但请注意,你无法删光所有的场景——你至少要为房间留下最后一个场景。
房间内,除了「场景」,还有一种「场景组」的结构。场景组可以包含其他场景或场景组。房间本身也是一个特殊的场景组,即根场景组。我们无法展示某个场景组,但可以展示某个特定的场景。此外,场景本身不再包含更微观的结构了。
这种组织结构,让房间内的场景、场景组呈现树状结构。你可以巧妙地设计一个树状结构,以满足你的业务场景。
如上图设计的组织结构,可以满足如下业务需求。
每一个场景和场景组都有一个地址(用一个字符串标识),该地址可以唯一标识某个场景或场景组。地址的法则如下。
/
。/${scene-name}
。其中 ${scene-name}
为场景或场景组的名字。如上法则可能很抽象,我们可以看一个例子。
对于场景组 /math
,场景 /math/class-A
和 /math/class-B
都属于它,而 /physical/class-C
不属于它。
此外,任何刚刚新建的房间,默认都只包含一个场景,该场景的地址为 /init
。
如果你觉得场景标识法则有些晦涩,可以把场景想象成文件,场景组想象成文件夹,它们的地址想象成 Unix / Linux 中文件系统的地址。
你可以直接增、删场景,于此关联的场景组会被自动增、删,换而言之,你不需要特意管理场景组。
举个例子,假如当前房间只有 /
场景组和 /init
场景。
首先,你新增一个地址为 /math/class-A
的场景。该场景从属于 /math
场景组,但该场景组并不存在。因此,/math
场景组会被自动添加。
随后,你又新增了一个地址为 /math/class-B
的场景。由于 /math
场景组是存在的,新场景被直接添加到 /math
场景组中。
之后,你删除了地址为 /math/class-A
的场景,于是它就被删了。
最后,你删除了地址为 /math/class-B
的场景,此时,/math
场景组中所有的元素都被删除了,于是 /math
场景组被自动删除。
场景以及场景组的管理遵循如下三条法则。
/init
的场景。新增场景时,可能会自动创建一系列相关的场景组父亲节点。其中任何一个父亲节点创建失败,都会导致「新增场景」这一行为失败。这种失败常常是因为某个自动创建的父亲节点场景组存在与之同名的场景,基于同一场景组内,禁止存在同名元素的原则,导致自动创建行为失败。
场景组包含多个元素,元素既可以是场景,也可以是场景组。场景组内的场景是有序的。每一个元素都有自己的名字,同一个场景组内的元素不允许重名。如此看来,从数据结构的角度来看,场景组就是一个有序字典。
你可以手动调整场景组中场景的顺序(但场景组没有顺序可言)。