Entity 触发器
监听 RxDB Entity 的数据变更,自动触发关联任务。
注册触发器
// 当 Product 创建时触发库存同步
const unregister = rxdb.trigger.entityTriggers.register({
entity: 'Product',
on: 'create',
taskId: 'sync-inventory'
});
// 监听多种事件
rxdb.trigger.entityTriggers.register({
entity: 'Order',
on: ['create', 'update'],
taskId: 'process-order-change'
});
// 取消注册
unregister();
事件类型
| 事件 | 触发时机 |
|---|---|
create | Entity 新建时 |
update | Entity 更新时 |
remove | Entity 删除时 |
过滤
只对满足条件的变更触发任务:
rxdb.trigger.entityTriggers.register({
entity: 'Order',
on: 'update',
taskId: 'notify-high-value',
filter: payload => {
return payload.data?.total > 10000;
}
});
Payload 映射
转换触发 payload,只传递必要的数据:
rxdb.trigger.entityTriggers.register({
entity: 'User',
on: 'create',
taskId: 'send-welcome-email',
payloadMapper: payload => ({
userId: payload.id,
email: payload.data?.email
})
});
EntityTriggerPayload
触发器收到的 payload 结构:
interface EntityTriggerPayload<T = unknown> {
entity: string; // Entity 名称
namespace: string; // Entity 命名空间
event: EntityTriggerEvent; // 'create' | 'update' | 'remove'
id: unknown; // Entity ID
data?: T; // Entity 数据
_triggerDepth: number; // 当前触发深度
_triggerSourceChain: string[]; // 触发链路
}
防环机制
Entity 触发器可能产生级联触发(A 的变更触发 B,B 的变更又触发 A)。插件通过 _triggerDepth 追踪触发深度,超过上限自动停止:
rxdb.trigger.entityTriggers.register({
entity: 'Product',
on: 'update',
taskId: 'cascade-update',
maxDepth: 3 // 默认 5
});
跨 Tab 去重
Entity 触发器只处理本地事件(origin: 'local')。通过 BroadcastChannel 跨 tab 同步的远程事件不会重复触发。
管理
// 列出所有触发器定义
const triggers = rxdb.trigger.entityTriggers.list();
// 注销指定 entity 的所有触发器
rxdb.trigger.entityTriggers.unregister('Product');
// 注销指定 entity 的特定事件触发器
rxdb.trigger.entityTriggers.unregister('Product', 'update');