dataviewjs的复用:一处编写,多处复用

dataview这个插件很强大,我从一开始用obsidian就开始用这个插件了,尤其是他的dataviewjs,简直不要太爽。

问题和解决方法说明

但是有一些问题存在,下面我举个例子来进行说明。
例子:我想对日历使用dataviewjs进行索引,并对他们按年分类。

  • ①解决方法1​:x:
    • 方法:这个按照传统的方法,先写好对某年的日记的索引dv代码,然后复制粘贴编写好的代码改改就可以了。
    • 缺点:假如这个代码在多处被复用,那么如果你想修改这个代码,那你就得找到这个代码被使用的每个地方,然后一个一个的修改他,很麻烦!
  • ②解决方法2​:white_check_mark:
    • 方法
      • 在文档A编写dataviewjs代码 —— 一处编写
        • 在dataviewjs代码中使用代码 app.workspace.getActiveFile() 获取你点击的文件,这是实现“一处编写,多处复用”的核心步骤
      • 在文档B引用文档A,即 ![[A]] —— 多处复用
        • 需要文档B的一些信息来配合文档A中的dataviewjs代码,比如文档的名称,路径……
      • 现在当你点击文档B时,dataviewjs代码会根据你点击的文档展示对应的结果
    • 优点
      • 你不需要在复制粘贴dataviewjs代码,而是只需要引用编写好dataviewjs代码的文档即可。
      • 而且当你想要修改dataviewjs代码时,你只用修改一处即可。

下面展示下我的示例

对日记按年索引,只在一个位置编写dataviewjs代码,在其它以年份命名的文档进行引用,即可实现点击某个以年份命名的文档,dataviewjs就会显示该年的日记。

4 个赞

这个思路不错,求dataviewJS代码

代码有的内容可能是不需要的旧代码,只是懒得改了

// 可选参数
var Year = app.workspace.getActiveFile().basename
// 年份:例如:"2021",不填则赋值 false
var Month = false
// 月份:例如:"07",不填则赋值 false


// 请勿设置 daily日记插件的日期格式,保持系统默认:YYYY-MM-DD
// ===================================================================
// 日期格式正则校验
if (Year && Month) {
	dv.header(3, Year + "-" + Month);
	var dateFormat = new RegExp(Year + "-" + Month + "-\\d{2}");
}
else if (Year && !Month) {
	dv.header(3, Year);
	var dateFormat = new RegExp(Year + "-\\d{2}-\\d{2}");
}
else if (!Year && Month) {
	dv.header(3, Month);
	var dateFormat = new RegExp("\\d{4}-" + Month + "-\\d{2}");
}
else {
	dv.header(3, "All Daily Notes");
	var dateFormat = /\d{4}-\d{2}-\d{2}/;
}

// 获取负荷日期格式的日记
var dailyNotes = dv.pages().where(b => dateFormat.test(b.file.name)&&b.file.name.length==10).sort(b => b.file.name, 'desc')

// 处理展示日记
var showDaily = new Array();
for (var page of dailyNotes) {
	
	var dstr = page.file.link

	// 处理周几
	var weekArray = new Array("日", "一", "二", "三", "四", "五", "六");
	var week = weekArray[new Date(`${page.file.name}`).getDay()]
	dstr = dstr + ` 周${week} `

	// 处理待做
	var todo = " 🟢 "
	if (page.file.tasks.length) {
		for (var task of page.file.tasks) {
			if (!task.completed) {
				todo = " 🔴 "
				break
			}
		}
	}
	dstr = dstr + todo

	// 处理des
	dstr = dstr + " " + page.des
	showDaily.push(dstr)
}


dv.list(showDaily)
2 个赞