## `dv.paragraph` 的内嵌问题 `![[]]` 内嵌页面在`dv.paragraph`里不会正常显示;这是Obsidian API的问题。普通的链接倒是能够顺利显示。(可以显示外部网络连接,也可以显示本地的绝对链接) ## 不要忘记 `.file` `dv.page` 和 `dv.pages` 返回的都是dv专有的数据结构,且*并不*实际包括用户通常在乎的数据,而是需要加`.file`来获取实际的含有文件信息的数据结构。 ```dataviewjs dv.paragraph("正确的访问方式输出的结果:" + dv.current().file.name); dv.paragraph("错误的访问方式输出的结果:" + dv.current().name); ``` ## 时间类型 dv中返回的时间虽然可以用`dv.paragraph`输出,但是并不是字符串,而是[Luxon的DateTime](https://moment.github.io/luxon/#/tour?id=your-first-datetime),因此在不清楚对象类型的情况下贸然加减比较的话很容易出问题。因此,如果你要比较一个dv内置的时间对象和某个类似日记文件名这样的字符串的话,需要考虑类型转换。 ```dataviewjs dv.paragraph("表面上看的dv时间信息:" + dv.current().file.ctime); dv.paragraph("强行cast成字符串的dv时间信息:" + dv.current().file.ctime); dv.paragraph("相同日期的Luxon时间和字符串相等判断:" + (luxon.DateTime("2020-05-06") == "2020-05-06")); ``` 和有强类型的语言不同,当你将不相匹配的数据类型相减的时候,并不会报错。 ```dataviewjs dv.paragraph("一个普通的Date对象和一个dv时间对象相减:" + (Date("2021-05-06") - dv.current().file.cday)); ``` 所以在用来排序的时候注意不要用这种类型不匹配的时间差。 ## Dv中链接类型拥有的属性 ```dataviewjs var link = dv.current().file.outlinks[0]; dv.paragraph(Object.getOwnPropertyNames(link)); dv.paragraph("Path: " + link.path); dv.paragraph("Embed: " + link.embed); dv.paragraph("Display: " + link.display); dv.paragraph("Type: " + link.type); ``` 除了以上的几个属性外,link在强制cast成字符串的时候,是`[[{path}|{display name}]]`格式的字符串。 ## 自定义属性中的时间日期 如果用户在yaml中写入的属性呈现为时间/日期的格式,比如 ``` --- review: 2021-09-22 --- ``` 那么在使用dv检索时,`review`会实际被转换成时间对象,不能再作为字符串进行对比:比如在筛选时就需要这样: `LIST FROM "" WHERE review = date("2021-09-22")` 而不是 `LIST FROM "" WHERE review = "2021-09-22"`。 ## 其他小技巧 - `file.day` 等效于 `date(file.name)`,会试图读取文件名中的日期。读不出来则为空值。这个在DV和DVJS里都适用。 - `date(now)` 可以在 DV 里用于选定当前时间。 - `dv.current()` 指的是当前文件;比如`dv.current().file.name`就是当前文件名。 - DV:`FROM [[#]]` 是个特殊的来源简写方式,代表“选取所有链接到本文的文件为来源”。反之,`FROM outgoing([[#]])` 是“选取所有本文的链接目标为来源” ## `contains` `contains`在对于处理字符串数组的时候,不会进行全等对比,而是进行substring查找。 > `contains(["abc"], "ab"])` returns `true` 要进行全等对比,需要用`econtains`。 ## `if` 使用`if`对于存在性进行判定的时候,比如`if (dv.pages("asdfasd").someField)`,要注意:DataArray对象即使是空的,直接进行存在性判定也是`true`。 ## 单向链接 Dataview生成的链接并不实际存在,所以也不会计入文件的回(反)链中。 简单的写法: ``` `=[[some file]]` ```