ctx.getVar()

Membaca nilai variabel secara async dari konteks runtime saat ini. Sumber variabel sama dengan resolusi {{ctx.xxx}} di SQL, template, biasanya berasal dari user saat ini, record saat ini, parameter view, konteks popup, dll.

Skenario Penggunaan

SkenarioDeskripsi
JSBlock / JSFieldMendapatkan informasi seperti record, user, resource saat ini untuk render atau penilaian logika
Aturan Linkage / Event FlowMembaca ctx.record, ctx.formValues, dll. untuk penilaian kondisi
Formula / TemplateMenggunakan aturan resolusi variabel yang sama dengan {{ctx.xxx}}

Definisi Tipe

getVar(path: string): Promise<any>;
ParameterTipeDeskripsi
pathstringPath variabel, harus dimulai dengan ctx., mendukung akses titik dan indeks array

Return Value: Promise<any>, perlu menggunakan await untuk mendapatkan nilai yang sudah di-resolve; mengembalikan undefined saat variabel tidak ada.

Jika meneruskan path yang tidak dimulai dengan ctx., akan melempar error: ctx.getVar(path) expects an expression starting with "ctx.", got: "...".

Path Variabel Umum

PathDeskripsi
ctx.recordRecord saat ini (tersedia saat form/detail terikat record)
ctx.record.idPrimary key record saat ini
ctx.formValuesNilai form saat ini (sering digunakan pada aturan linkage, event flow; pada skenario form lebih utamakan ctx.form.getFieldsValue() untuk membaca real-time)
ctx.userUser yang sedang login
ctx.user.idID user saat ini
ctx.user.nicknameNickname user saat ini
ctx.user.roles.nameNama role user saat ini (array)
ctx.popup.recordRecord dalam popup
ctx.popup.record.idPrimary key record dalam popup
ctx.urlSearchParamsParameter query URL (di-parse dari ?key=value)
ctx.tokenAPI Token saat ini
ctx.roleRole saat ini

ctx.getVarInfos()

Mendapatkan informasi struktur variabel yang dapat di-resolve dalam konteks saat ini (tipe, judul, sub-properti, dll.), untuk eksplorasi path yang tersedia. Return value adalah deskripsi statis berbasis meta, tidak termasuk nilai runtime aktual.

Definisi Tipe

getVarInfos(options?: { path?: string | string[]; maxDepth?: number }): Promise<Record<string, any>>;

Setiap key di return value adalah path variabel, value adalah informasi struktur yang sesuai dengan path tersebut (berisi type, title, properties, dll.).

Parameter

ParameterTipeDeskripsi
pathstring | string[]Path pemotongan, hanya mengumpulkan struktur variabel di bawah path tersebut. Mendukung 'record', 'record.id', 'ctx.record', '{{ ctx.record }}'; array berarti gabungan beberapa path
maxDepthnumberLevel maksimum yang di-expand, default 3. Saat tidak meneruskan path properti tingkat atas depth=1; saat meneruskan path, node yang sesuai dengan path memiliki depth=1

Contoh

// Mendapatkan struktur variabel di bawah record (maksimal expand 3 level)
const vars = await ctx.getVarInfos({ path: 'record', maxDepth: 3 });

// Mendapatkan struktur popup.record
const vars = await ctx.getVarInfos({ path: 'popup.record', maxDepth: 3 });

// Mendapatkan struktur variabel tingkat atas yang lengkap (default maxDepth=3)
const vars = await ctx.getVarInfos();

Perbedaan dengan ctx.getValue

MethodSkenario PenggunaanDeskripsi
ctx.getValue()Field yang dapat diedit seperti JSField, JSItemMendapatkan nilai field saat ini secara sinkron, perlu binding form
ctx.getVar(path)Konteks RunJS apa punMendapatkan variabel ctx apa pun secara async, path perlu dimulai dengan ctx.

Pada JSField, gunakan getValue/setValue untuk membaca/menulis field ini; gunakan getVar untuk mengakses variabel konteks lain (seperti record, user, formValues).

Hal yang Perlu Diperhatikan

  • path harus dimulai dengan ctx.: seperti ctx.record.id, jika tidak akan melempar error.
  • Method async: harus menggunakan await untuk mendapatkan hasil, seperti const id = await ctx.getVar('ctx.record.id').
  • Variabel tidak ada: mengembalikan undefined, dapat menggunakan ?? setelah hasil untuk menyetel default value: (await ctx.getVar('ctx.user.nickname')) ?? 'Tamu'.
  • Nilai form: ctx.formValues perlu didapatkan melalui await ctx.getVar('ctx.formValues'), tidak diekspos langsung sebagai ctx.formValues. Pada konteks form lebih utamakan ctx.form.getFieldsValue() untuk membaca nilai terbaru secara real-time.

Contoh

Mendapatkan ID Record Saat Ini

const recordId = await ctx.getVar('ctx.record.id');
if (recordId) {
  ctx.message.info(`Record saat ini: ${recordId}`);
}

Mendapatkan Record dalam Popup

const recordId = await ctx.getVar('ctx.popup.record.id');
if (recordId) {
  ctx.message.info(`Record popup saat ini: ${recordId}`);
}

Membaca Sub-Item Field Array

const roleNames = await ctx.getVar('ctx.user.roles.name');
// Mengembalikan array nama role, seperti ['admin', 'member']

Menyetel Default Value

// getVar tidak memiliki parameter defaultValue, dapat menggunakan ?? setelah hasil
const userName = (await ctx.getVar('ctx.user.nickname')) ?? 'Tamu';

Membaca Nilai Field Form

// ctx.formValues sama dengan ctx.form pada skenario form, dapat menggunakan getVar untuk membaca field nested
const status = await ctx.getVar('ctx.formValues.status');
if (status === 'draft') {
  // ...
}

Membaca Parameter Query URL

const id = await ctx.getVar('ctx.urlSearchParams.id'); // sesuai dengan ?id=xxx

Eksplorasi Variabel yang Tersedia

// Mendapatkan struktur variabel di bawah record (maksimal expand 3 level)
const vars = await ctx.getVarInfos({ path: 'record', maxDepth: 3 });
// vars seperti { 'record.id': { type: 'string', title: 'id' }, ... }

Terkait

  • ctx.getValue() - Mendapatkan nilai field saat ini secara sinkron (hanya JSField/JSItem, dll.)
  • ctx.form - Instance form, ctx.form.getFieldsValue() dapat membaca nilai form secara real-time
  • ctx.model - Model dalam konteks eksekusi saat ini
  • ctx.blockModel - Parent block tempat JS saat ini berada
  • ctx.resource - Instance resource dalam konteks saat ini
  • {{ctx.xxx}} di SQL / Template - Menggunakan aturan resolusi yang sama dengan ctx.getVar('ctx.xxx')