๋ทฐ(Views)๋ Obsidian์ด ์ฝํ ์ธ ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํฉ๋๋ค. ํ์ผ ํ์๊ธฐ, ๊ทธ๋ํ ๋ทฐ, ๋งํฌ๋ค์ด ๋ทฐ๋ ๋ชจ๋ ๋ทฐ์ ์์์ด์ง๋ง, ํ๋ฌ๊ทธ์ธ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ์ฝํ ์ธ ๋ฅผ ํ์ํ๋ ์ฌ์ฉ์ ์ ์ ๋ทฐ๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ๋ทฐ๋ฅผ ๋ง๋ค๋ ค๋ฉด ItemView ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ๋ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค:
import { ItemView, WorkspaceLeaf } from 'obsidian';
export const VIEW_TYPE_EXAMPLE = 'example-view';
export class ExampleView extends ItemView {
constructor(leaf: WorkspaceLeaf) {
super(leaf);
}
getViewType() {
return VIEW_TYPE_EXAMPLE;
}
getDisplayText() {
return 'Example view';
}
async onOpen() {
const container = this.contentEl;
container.empty();
container.createEl('h4', { text: 'Example view' });
}
async onClose() {
// ์ ๋ฆฌํ ๊ฒ์ด ์์ต๋๋ค.
}
}
Note
createEl()
๋ฉ์๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ HTML elements๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฐ ๋ทฐ๋ ํ
์คํธ ๋ฌธ์์ด๋ก ๊ณ ์ ํ๊ฒ ์๋ณ๋๋ฉฐ, ์ฌ๋ฌ ์์
์์ ์ฌ์ฉํ๋ ค๋ ๋ทฐ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด ๊ฐ์ด๋์ ๋ท๋ถ๋ถ์์ ๋ณด๊ฒ ๋ ๊ฒ์ฒ๋ผ, ์ด๋ฅผ ์์ VIEW_TYPE_EXAMPLE
๋ก ์ถ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
getViewType()
์ ๋ทฐ์ ๊ณ ์ ์๋ณ์๋ฅผ ๋ฐํํฉ๋๋ค.getDisplayText()
๋ ๋ทฐ์ ์ฌ๋์ด ์ฝ๊ธฐ ์ฌ์ด ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.onOpen()
์ ์ ๋ฆฌํ(leaf) ๋ด์์ ๋ทฐ๊ฐ ์ด๋ฆด ๋ ํธ์ถ๋๋ฉฐ ๋ทฐ์ ์ฝํ ์ธ ๋ฅผ ๋น๋ํ๋ ์ญํ ์ ํฉ๋๋ค.onClose()
๋ ๋ทฐ๊ฐ ๋ซํ์ผ ํ ๋ ํธ์ถ๋๋ฉฐ ๋ทฐ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ๋ทฐ๋ ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋ ๋ ๋ฑ๋ก๋๊ณ ํ๋ฌ๊ทธ์ธ์ด ๋นํ์ฑํ๋ ๋ ์ ๋ฆฌ๋์ด์ผ ํฉ๋๋ค:
import { Plugin, WorkspaceLeaf } from 'obsidian';
import { ExampleView, VIEW_TYPE_EXAMPLE } from './view';
export default class ExamplePlugin extends Plugin {
async onload() {
this.registerView(
VIEW_TYPE_EXAMPLE,
(leaf) => new ExampleView(leaf)
);
this.addRibbonIcon('dice', 'Activate view', () => {
this.activateView();
});
}
async onunload() {
}
async activateView() {
const { workspace } = this.app;
let leaf: WorkspaceLeaf | null = null;
const leaves = workspace.getLeavesOfType(VIEW_TYPE_EXAMPLE);
if (leaves.length > 0) {
// ์ฐ๋ฆฌ ๋ทฐ๊ฐ ์๋ ๋ฆฌํ๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก ๊ทธ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
leaf = leaves[0];
} else {
// ์์
๊ณต๊ฐ์์ ์ฐ๋ฆฌ ๋ทฐ๋ฅผ ์ฐพ์ ์ ์์ผ๋ฏ๋ก
// ์ค๋ฅธ์ชฝ ์ฌ์ด๋๋ฐ์ ์ ๋ฆฌํ๋ฅผ ๋ง๋ญ๋๋ค.
leaf = workspace.getRightLeaf(false);
await leaf.setViewState({ type: VIEW_TYPE_EXAMPLE, active: true });
}
// ์ถ์๋ ์ฌ์ด๋๋ฐ์ ์๋ ๊ฒฝ์ฐ ๋ฆฌํ๋ฅผ "๋๋ฌ๋
๋๋ค".
workspace.revealLeaf(leaf);
}
}
registerView()์ ๋ ๋ฒ์งธ ์ธ์๋ ๋ฑ๋กํ๋ ค๋ ๋ทฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ํฉํ ๋ฆฌ ํจ์์ ๋๋ค.
Warning
ํ๋ฌ๊ทธ์ธ์์ ๋ทฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ๋ ๊ด๋ฆฌํ์ง ๋ง์ธ์. Obsidian์ ๋ทฐ ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ ์ ์์ต๋๋ค. ๋ทฐ์์ ๋ถ์์ฉ์ ํผํ๊ณ , ๋ทฐ ์ธ์คํด์ค์ ์ ๊ทผํด์ผ ํ ๋๋ง๋ค
getLeavesOfType()
์ ์ฌ์ฉํ์ธ์.this.app.workspace.getLeavesOfType(VIEW_TYPE_EXAMPLE).forEach((leaf) => { if (leaf.view instanceof ExampleView) { // ๋ทฐ ์ธ์คํด์ค์ ์ ๊ทผํฉ๋๋ค. } });