我正在开发一个简单的应用程序来构建节点中的树。我有以下挂钩设置,以便从树中删除节点时,将删除所有子节点,并删除这些节点的所有关联。我使用以下代码尝试创建此行为:
// delete node hook
db.nodes.hook('deleting', function(key, record, transaction){
// after deleting a node, go delete its associations
this.onsuccess = function(){
console.log(transaction);
transaction.links.where('node').equals(record.id).delete();
};
});
// delete link hook
db.links.hook('deleting', function(key, record, transaction){
// start delete cascade to prevent dead entries
this.onsuccess = function(){
transaction.nodes.where('id').equals(record.child).delete();
};
});

这就是给我这个错误"未处理的拒绝:NotFoundError:Tablelinks不是交易的一部分"。我记录了事务对象以检查它,并查看了该错误可能来自的源代码,它看起来像是storeNames。我的数据库结构如下:
db.version(1).stores({
nodes : '++id, title, content',
links : '&[node+child], node, child'
});

但我只看到"节点"当我查看storeNames时。我正在使用Dexie版本2 beta 10 - 这很可能是问题所在,但我不确定,因为这是我的第一个indexeddb项目,并且推荐了dexie。由于所有指南都使用2.x内容的语法,因此我使用了测试版。
非常感谢任何见解!
- 短暂延迟 - 我刚刚尝试了最新的1.x版本,现在我收到了这个错误:"未处理的拒绝:错误:执行失败' objectStore' on' IDBTransaction':未找到指定的对象库。"
因此,发布版和测试版都不能删除挂钩吗?或者更可能的是,我做错了什么?我跟着this,正如您所看到的,我的钩子代码基于那里提供的示例。我尝试在商店之后立即设置挂钩,并在开放的承诺内,但似乎没有什么对我有用。哈哈,对于最终没有连接到根的节点,我宁愿进行多次级联删除,而不是多次扫描整个数据库。
- 编辑: 事实证明,我可以通过使用事务块并在事务中包含两个表后从执行删除来解决此问题。问题是我在这里写的钩子代码中使用的事务不知道除了涉及事务的表之外的任何表。
答案 0 :(得分:0)
仅用代码示例来完善作者的答案,您可以通过在实例化作为参数传递给hook方法的事务的语句中添加“链接”表来纠正问题。该语句未在问题中显示,但应类似于以下内容……
db.transaction('rw', db.nodes, function () { ... }
如果是这种情况,则更正后的代码将是...
db.transaction('rw', db.nodes, db.links, function () { ... }