跳到主要内容

useWorkingTree()

function useWorkingTree(): WorkingTreeResource;

Defined in: use-working-tree.ts:166

读写当前数据库的工作树。

Returns​

WorkingTreeResource

见 WorkingTreeResource

Throws​

没有 provideRxDB、数据库尚未就绪,或创建失败时抛错(与 useRxDB 同语义)

Example​

@Component({
template: `
@switch (tree.statusState().phase) {
@case ('loading') `{ <span>读取中…</span> }`
@case ('empty') `{ <span>没有未提交的改动</span> }`
@case ('success') `{ <span>{{ tree.statusState().value.entryCount }} 条未提交</span> }`
}
<button [disabled]="tree.commitState().phase === 'loading'" (click)="save()">提交</button>
`
})
export class CommitBar {
readonly tree = useWorkingTree();
async save(): Promise<void> {
const status = await this.tree.status();
const result = await this.tree.commit('保存', {
expectedBranch: {
branchId: status.branchId,
activationRevision: status.activationRevision
},
expectedHeadRevision: status.headRevision,
expectedWorkingTreeRevision: status.workingTreeRevision,
authorId: 'alice',
operationId: crypto.randomUUID()
});
if (!result.ok) console.warn('别人先提交了,重试即可', result.conflict);
}
}

Remarks​

必须在 Angular 注入上下文中调用 —— 它经 useRxDB() 取库。十二格状态挂在本次调用 自己的 signal 上,没有跨组件共享的单例缓存。

创建入口本身一次 IO 都不发:十二格初值全是 idle,只有真的调了方法才会去读库。 挂上就查会让每个只想拿到 commit() 的组件在挂载时白发一轮查询。

没有变更流:状态只在经本入口发出的命令之后更新。别的标签页写进来的改动、 直接走 entity.save() 的写入,都不会推一份新的 status 过来 —— 需要最新值就再调一次 status()。这是核心侧至今没有工作树变更流的如实反映,不是这里省了一步。

数据库取不到时抛错而不是返回一份「一切干净」的默认值:那会把「入口没接上」 伪装成「没有未提交变更」,恰好是最需要出声的时候不出声。