实战
实战
重渲染接口替换问题
详见 AnyBlock 的开发文档
meta bind 插件配合兼容问题
主要在这里发现了一些 render 接口的ctx的细节
// 情况
meta-bind-button
// 这里的 e,t,n 是:stc源码、el、上下文。重渲染情况下,上下文缺失/异常
// 类型为 MarkdownPostProcessorContext
this.registerMarkdownCodeBlockProcessor("meta-bind-button", (e,t,n)=>{ ... })
// 然后发现重渲染可能会导致这里的ctx和原预想行为不同,导致存在渲染失败的问题
/**
* 上下文内容:
* 代码渲染时上下文:MarkdownPostProcessorContext
* 阅读模式时上下文:MarkdownPostProcessorContext
* 重新渲染时上下文:MarkdownPostProcessorContext
* app.workspace.activeLeaf.view找到模拟上下文 (?)
* MarkdownPostProcessorContext内容:
* - (API) docId、sourcePath、frontmatter、addChild、getSectionInfo
* - (实际还有) containerEl、el、promises
*
* 重渲染的区别:
* - containerEl: 为重渲染的容器,正常为div.cm-scroller
* - docId: 有所不同
* - 多了个displayMode属性
* - frontmatter: underfined,正常为 {}
* - sourcePath: "",正常为文件名
*
* static render(app: App, markdown: string, el: HTMLElement, sourcePath: string, component: Component): Promise<void>;
* 声明见:https://github.com/obsidianmd/obsidian-api/blob/23947b58d372ea02225324308e31d36b4aa95869/obsidian.d.ts#L4
* 可以发现传递内容影响上下文:el->containerEl,sourcePath->sourcePath,markdown影响getSectionInfo功能
*/
console.log("btn-debug1", e, t, n)
if (!n.containerEl?.classList.contains("cm-scroller")) {
console.log("btn-debug2 rerender-env")
}
后来发现,是执行 render 之前,要执行 ctx.addChild
,就可以解决了
链接到当前文件 0
没有文件链接到当前文件