文档核心概念Attached 和 Detached 状态

Attached 与 Detached 状态

快速对照

Loro 在两个不同语境下使用 “attached/detached”:

  1. 文档状态——版本同步(最新 vs 历史)
  2. 容器状态——文档归属(属于文档 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 ();
.(.()); // false

Attached(文档成员)

  • 处于文档层级中
  • 拥有 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, );

相关文档