3

我正在开发一个简单的应用程序来构建节点树。我有以下钩子设置,以便当从树中删除节点时,所有子节点都被删除,并且这些节点的所有关联也被删除。我正在使用以下代码来尝试创建此行为:

      // 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 not part of transaction”。我记录了事务对象以检查它,并查看了该错误可能来自何处的源代码,它看起来像是 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 版本中再次尝试过,现在出现了这个错误:“未处理的拒绝:错误:无法在 'IDBTransaction' 上执行 'objectStore':找不到指定的对象存储。 "

那么无论是发布版还是测试版都不能删除钩子?或者更有可能,我只是做错了什么吗?我遵循了这一点,如您所见,我的钩子代码基于那里提供的示例。我尝试在商店之后和公开承诺内设置挂钩,但似乎没有什么对我有用。我宁愿进行一种级联删除,也不愿多次扫描整个数据库以查找最终未连接到根的节点,哈哈。

--edit:事实证明,我可以通过使用事务块并在将两个表都包含在事务中之后从那里执行删除来解决这个问题。问题是我在这里编写的钩子代码中使用的事务不知道除了事务中涉及的表之外的任何表。

4

1 回答 1

0

只是为了用代码示例完成作者的回答,您可以通过将“链接”表添加到实例化作为参数传递到钩子方法的事务的语句中来纠正问题。此声明未在问题中显示,但它应该看起来像这样......

db.transaction('rw', db.nodes, function () { ... }

如果是这种情况,更正的代码将是......

db.transaction('rw', db.nodes, db.links, function () { ... }
于 2019-04-14T05:04:48.523 回答