返回首页

DataviewJS 和 Meta Bind 用于 Obsidian 按日期的任务

文章描述了使用 Meta Bind 和 DataviewJS 在 Obsidian 中实现交互式页面,用于查看选定日期的任务。代码分解、插件安装和使用细节。适合使用 Obsidian 的中高级开发者。

动态 Obsidian 任务:使用 Meta Bind 点击选择日期
Advertisement 728x90

使用 Meta Bind 和 DataviewJS 实现 Obsidian 交互式任务视图:按选定日期动态筛选

Meta Bind 和 DataviewJS 插件可创建一个带有交互式日期选择器的页面,用于查看任务。在阅读模式下,用户点击日历、选择日期——任务列表会自动更新。此解决方案利用 YAML 属性作为输入小部件和输出脚本之间的中间存储。

这消除了手动编辑 Tasks 或 Dataview 查询的需要,无需每次在代码中更改日期。

设置:安装插件和 YAML 块

通过 Obsidian 设置安装 Meta Bind 和 Dataview 插件。在 Dataview 中,启用 JavaScript 查询。

Google AdInline article slot

创建一个文件,例如 DynamicTasks.md,并添加 YAML 块:

---
selected-date: 2025-12-30
---

初始值将被小部件覆盖。

Meta Bind 小部件用于日期选择

在 YAML 下方插入:

Google AdInline article slot

INPUT[datePicker: selected-date]

在阅读模式下,会出现一个日历。点击打开日期选择器,值将保存到 selected-date

DataviewJS 脚本:筛选和渲染任务

在小部件后添加脚本以搜索任务:

Google AdInline article slot

const targetDate = dv.current().file.frontmatter["selected-date"];

const pages = dv.pages('"Work"')

.where(p => p.file.tasks

.where(t => !t.completed && t.due && t.due.toISODate() === targetDate)

.length > 0);

for (let page of pages) {

dv.el("div", dv.fileLink(page.file.path, false), {

attr: {

style: "display:inline-block; margin:8px 0 4px 0; padding:3px 8px; border-radius:6px; background:#e0f0ff; color:#0366d6; font-weight:500;"

}

});

dv.taskList(

page.file.tasks

.where(t => !t.completed && t.due && t.due.toISODate() === targetDate),

false

);

}

脚本详解

  • 读取日期dv.current().file.frontmatter["selected-date"] 返回字符串 YYYY-MM-DD
  • 搜索文件dv.pages('"Work"') 扫描文件夹。过滤器检查未完成任务,其 due 日期通过 .toISODate() 匹配 targetDate
  • 渲染:为每个文件——一个带有 CSS 样式的徽章链接和 dv.taskList,无分组(false)。将 "Work" 替换为您的文件夹。

集成到 Canvas 仪表板

将文件拖到 Canvas 上——Obsidian 会创建一个交互式卡片。调整大小。直接在仪表板上工作或点击导航。

要求和特性

  • 任务语法:使用表情符号 📅 YYYY-MM-DD 表示 due。没有日期的常规复选框将被忽略。
  • 更新:更改日期后,DataviewJS 会延迟约 1 秒重新启动。

关键点

  • Meta Bind 的交互式 datePicker 无需手动编辑即可更新 YAML。
  • DataviewJS 通过精确匹配 due.toISODate() === targetDate 筛选任务。
  • 按文件分组,带有自定义徽章以控制 UI。
  • 在 Canvas 中自动渲染,无需额外插件。
  • 适用于检查未来日期的工作量(如假期、会议)。

相对于静态查询的优势

| 方法 | 更改日期 | 阅读模式 | 自动更新 |

|------|----------|----------|----------|

| Tasks due on DATE | 在代码中手动 | 否 | 否 |

| Dataview due = date() | 在代码中手动 | 否 | 否 |

| YAML + Meta Bind + DataviewJS | 点击日历 | 是 | 是 |

此解决方案可扩展:在 .where() 中添加标签或状态过滤器。

— Editorial Team

Advertisement 728x90

继续阅读