如何通过 dataviewjs 按钮修改 yaml 数据

我通过 gpt帮我写了一个代码,实现卡片复习功能的按钮。


功能是通过按钮忘记,记得和掌握来修改 yaml 的复习时间,可是为什么按钮没效果,应该参考什么文件或插件可以实现自动修改 yaml 的功能呢

const now = new Date();

// 计算下一次复习时间
function getNextDue(rememberCount) {
  const intervals = [2, 4, 7, 15, 30, 90];
  const days = intervals[Math.min(rememberCount, intervals.length - 1)];
  return window.moment().add(days, "days").toISOString();
}

// 读取并更新 YAML 头部
async function updateYamlInFile(file, field, value) {
  const fileContent = await app.vault.read(file);
  const yamlMatch = fileContent.match(/^---\n([\s\S]*?)\n---/);
  let yamlStr = "";
  let body = "";

  if (yamlMatch) {
    yamlStr = yamlMatch[1];
    body = fileContent.slice(yamlMatch[0].length);
  } else {
    // 如果没 YAML 头,创建空 YAML
    body = fileContent;
  }

  // 解析 YAML 字段(简单实现)
  let yamlObj = {};
  yamlStr.split('\n').forEach(line => {
    const idx = line.indexOf(':');
    if (idx > 0) {
      const key = line.slice(0, idx).trim();
      let val = line.slice(idx + 1).trim();
      // 简单转型
      if (val === '[]') val = [];
      else if (/^\d+$/.test(val)) val = Number(val);
      else if (val.startsWith('[') && val.endsWith(']')) {
        // 数组,简单处理
        val = val.slice(1, -1).split(',').map(s => s.trim());
      }
      yamlObj[key] = val;
    }
  });

  // 更新字段
  yamlObj[field] = value;

  // 把复习数组转成字符串
  if (field === "复习" && Array.isArray(value)) {
    yamlObj[field] = value;
  }

  // 重新生成 YAML 字符串
  let newYamlLines = [];
  for (const [k, v] of Object.entries(yamlObj)) {
    if (Array.isArray(v)) {
      newYamlLines.push(`${k}: [${v.join(', ')}]`);
    } else {
      newYamlLines.push(`${k}: ${v}`);
    }
  }
  const newYaml = `---\n${newYamlLines.join('\n')}\n---`;

  // 写回文件
  await app.vault.modify(file, `${newYaml}\n${body}`);
}

// 更新复习记录函数
async function updateReview(file, type, rememberCount, oldReview) {
  let newRemember = rememberCount;
  let newDue;

  if (type === "forgot") {
    newRemember = 0;
    newDue = window.moment().add(10, "minutes").toISOString();
  } else if (type === "remember") {
    newRemember += 1;
    newDue = getNextDue(newRemember);
  } else if (type === "master") {
    newRemember = 99;
    newDue = window.moment().add(30, "days").toISOString();
  }

  const today = window.moment().format("YYYY-MM-DD HH:mm");

  // 更新复习数组
  let newReview = Array.isArray(oldReview) ? [...oldReview] : [];
  newReview.push(`${today} ${type}`);

  await updateYamlInFile(file, "remember", newRemember);
  await updateYamlInFile(file, "due", newDue);
  await updateYamlInFile(file, "复习", newReview);

  new Notice(`${file.name} 已更新为 ${type}`);
}

// 主程序
const nowMoment = window.moment();

dv.pages()
  .filter(p => p.tags === "闪卡" || (Array.isArray(p.tags) && p.tags.includes("闪卡")))
  .filter(p => p.due && window.moment(p.due).isSameOrBefore(nowMoment))
  .sort(p => p.due, 'asc')
  .forEach(p => {
    const file = p.file;
    const remember = p.remember || 0;
    const reviewList = p["复习"] || [];

    const dueDate = p.due instanceof Date ? p.due.toISOString() : String(p.due);
    const dateOnly = dueDate.split("T")[0];

    dv.header(3, file.name);
    dv.paragraph(`🕒 下次复习时间: ${dateOnly} | 🧠 记得次数: ${remember}`);

    const container = dv.el("div", "", { cls: "review-buttons" });

    const btns = [
      { label: "❌ 忘记", type: "forgot" },
      { label: "✅ 记得", type: "remember" },
      { label: "🏆 掌握", type: "master" }
    ];

    btns.forEach(({ label, type }) => {
      const btn = dv.el("button", label, { cls: "review-btn" });
      btn.style.marginRight = "0.5em";
      btn.onclick = () => updateReview(file, type, remember, reviewList);
      container.appendChild(btn);
    });
  });

报错如下,问了 gpt 也没得到解决的答案

Uncaught (in promise) TypeError: e.cache is not a function
    at t.<anonymous> (app.js:1:753213)
    at app.js:1:248524
    at Object.next (app.js:1:248629)
    at a (app.js:1:247347)