Attached 与 Detached 状态
快速对照
Loro 在两个不同语境下使用 “attached/detached”:
- 文档状态——版本同步(最新 vs 历史)
- 容器状态——文档归属(属于文档 vs 独立存在)
⚠️ 这两个概念彼此独立——容器可以附着在处于 detached 状态的文档上。
文档状态
Attached(默认)
- 与最新的 OpLog 版本保持同步
- 正常编辑模式
- 所有操作立即生效
const = new ();
.(.()); // false - 默认状态Detached(时光旅行)
- 查看历史版本
- 默认禁用编辑
- OpLog 中存在未显示的更新操作
const = new ();
.("text").(0, "v1");
const = .();
.("text").(2, " -> v2");
// 切换到 v1
.();
.(.()); // true
.(.("text").()); // "v1"容器状态
Detached(独立)
- 通过构造函数创建(
new LoroMap()) - 不属于任何文档
- 没有有效的 ContainerID
- 常用于模板
const = new ();
.(.()); // falseAttached(文档成员)
- 处于文档层级中
- 拥有 ContainerID
- 变更会记录在文档中
const = new ();
const = .("data"); // attached
// 添加 detached 容器会返回 attached 版本
const = new ();
const = .("text", );
.(.()); // false - 原实例保持 detached
.(.()); // true - 返回的实例已 attached关键差异
| 维度 | 文档的 Attached/Detached | 容器的 Attached/Detached |
|---|---|---|
| 目的 | 版本控制 | 文档归属 |
| 触发时机 | 时光旅行、分支 | 添加到文档 |
| 独立性 | 不适用 | 与文档状态独立 |
| 编辑 | Detached 时受限 | 始终允许 |
常见用法
时光旅行
const = new ();
const = .();
// ... 继续编辑 ...
.(); // 查看旧版本
.(); // 回到最新状态容器模板
const = new ();
.("type", "task");
const = new ();
const = .("tasks");
// 复用模板多次
.(0, );
.(1, );相关文档
- OpLog 与 DocState——理解不同的版本状态
- 容器——容器类型与用法
- 时光旅行——使用 checkout 与分支