全称 Five-Elements-Operations 五元操作,由这五种基本操作可组合成用户的所有操作。
submitTransactions(ops: IOperation[])
UI 界面上用户的每一个操作,都会由逻辑层对本地的 Store 进行改变,并相应地生成一组 ops (IOperation[])。这一组 ops 发送到服务端,服务端则也会按照 ops 表示的意义来对数据库做相应地操作。
IOperation 结构如下:
interface IOperation {
cmd: string // 操作类型
_id: string // 操作对象的 id (目前只有 Brick,后期 workplace, collection 也会用到)
path: string[] // 操作对象的属性路径
table?: string // 操作对象所在的表(目前只有 Brick,后期 workplace, collection 也会用到)
args: { [x: string]: any } // 操作的参数
}
1. set
顾名思义,设置某个 brick 或其子属性的一组值。如果 brick 或子属性不存在,就创建它。
通常用于新建 brick 或覆盖式更新 props 属性值。
例1.1:
{
cmd: 'set',
_id: 'aaaaa-aaaa-aaaaaa',
path: [],
args: {
_id: 'aaaaa-aaaa-aaaaaa',
type: 'text',
version: 0
}
}
// 如果数据库里没有 "aaaaa-aaaa-aaaaaa" 这一条 brick,将在数据库中创建这一条数据。
// 如果数据库里已有这一条 brick,则将当前 brick 的数据直接替换为 arg 里的内容。
例1.2
{
cmd: 'set',
_id: 'aaaaa-aaaa-aaaaa',
path: ['props', 'title'],
args: [['hello', {bold: true}], ['world']]
}
// 将 "aaaaa-aaaa-aaaaaa"的 brick.props.title 属性值设置为 args 的内容。
2. update
对某个 brick 或其子属性上的部分值。
通常用于更新 brick 的创建时间、修改时间、版本、样式等。
例2.1 更新版本
{
cmd: 'update',
_id: 'bbbbb-bbbb-bbbbbb',
path: [],
args: {
version: 1
}
}
// 将 "bbbbb-bbbb-bbbbbb" brick 的版本更新为 1。
例2.2 软删除
{
cmd: 'update',
_id: 'bbbbb-bbbb-bbbbbb',
path: [],
args: {
alive: false
}
}
// 将 "bbbbb-bbbb-bbbbbb" brick 软删除。
3. listRemove
将某一条数据,从数组属性值中移除。
通常用于将某 brick 从其父级 brick 的集合中移除。
也通常用于改变次序时,首先『移除』、然后『插入』的『移除』这一步。
例3.1
注:listRemove 通常会与子 brick 软删除组合。
{
cmd: 'listRemove',
_id: 'ccccc-cccc-cccccc',
path: ['children'],
args: {
_id: 'xxxxx-xxxx-xxxxxx'
}
}
// 将 'xxxxx-xxxx-xxxxxx' 从 'ccccc-cccc-cccccc' 的 children 集合中移除
4. listAfter
将某一条数据,插入到数组属性值中,某个元素的后面。
通常用于拖拽元素后,先『移除』再『插入』的『插入』操作。
例4.1
{
cmd: 'listAfter',
_id: 'ccccc-cccc-cccccc',
path: ['children'],
args: {
_id: 'xxxxx-xxxx-xxxxxx',
after: 'yyyyy-yyyy-yyyyyy'
}
}
// 将 'xxxxx-xxxx-xxxxxx' 插入到 'ccccc-cccc-cccccc' 的 children 集合中的 'yyyy...' 后面的位置
5. listBefore
将某一条数据,插入到数组属性值中,某个元素的前面。
拖拽行为默认使用 listAfter,而 listBefore 通常用于 listAfter 表示不了的一些情况。
例5.1
{
cmd: 'listBefore',
_id: 'ccccc-cccc-cccccc',
path: ['children'],
args: {
_id: 'xxxxx-xxxx-xxxxxx',
before: 'yyyyy-yyyy-yyyyyy'
}
}
// 将 'xxxxx-xxxx-xxxxxx' 插入到 'ccccc-cccc-cccccc' 的 children 集合中的 'yyyy...' 前面的位置