logologo
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
logologo
ภาพรวม

บล็อก

ภาพรวม

บล็อกข้อมูล

ตาราง
ฟอร์ม
รายละเอียด
รายการ
การ์ดแบบกริด
แผนภูมิ

บล็อกตัวกรอง

ฟอร์ม

บล็อกอื่นๆ

แผงควบคุม
Iframe
บล็อกอ้างอิง
Markdown
JS Block

การตั้งค่าบล็อก

ขอบเขตข้อมูล
เลย์เอาต์
กฎการเชื่อมโยงบล็อก
กฎการเชื่อมโยงฟิลด์
กฎการเรียงลำดับ
ลบบล็อก
ชื่อบล็อก

ฟิลด์

ภาพรวม

การกำหนดค่าทั่วไป

ฟิลด์ตาราง
ฟิลด์รายละเอียด
ฟิลด์ฟอร์มตัวกรอง
ฟิลด์ฟอร์ม

การกำหนดค่าเฉพาะ

วันที่
ตัวจัดการไฟล์
ฟอร์มย่อย
ตัวเลือกแบบดรอปดาวน์
ตัวเลือกข้อมูล
ตัวเลือกแบบเชื่อมโยง
ตารางย่อย
รายละเอียดย่อย
หัวข้อ
JS Field
JS Item
JS Column

การตั้งค่าฟิลด์

ค่าเริ่มต้น
ป้ายกำกับฟิลด์
แสดงป้ายกำกับ
คำแนะนำฟิลด์
ขอบเขตข้อมูล
คอมโพเนนต์ฟิลด์
การจัดรูปแบบตัวเลข
โหมด
จำเป็น
ฟิลด์หัวข้อ
กฎการตรวจสอบ
คอมโพเนนต์ฟิลด์ความสัมพันธ์

การดำเนินการ

ภาพรวม

การตั้งค่าการดำเนินการ

ปุ่มแก้ไข
ยืนยันซ้ำ
การกำหนดค่าฟิลด์
ผูกกับเวิร์กโฟลว์
ป๊อปอัปแก้ไข
กฎการเชื่อมโยงการดำเนินการ

ประเภทการดำเนินการ

เพิ่มใหม่
ดู
ลบ
แก้ไข
นำเข้า
นำเข้า Pro
ส่งออก
ส่งออก Pro
ส่งออกไฟล์แนบ
ตัวกรอง
ลิงก์
เปิดป๊อปอัป
รีเฟรช
ส่งข้อมูล
ทริกเกอร์เวิร์กโฟลว์
อัปเดตระเบียน
อัปเดตเป็นชุด
เพิ่มระเบียนย่อย
JS Action
สิทธิ์การดำเนินการ

ขั้นสูง

กฎการเชื่อมโยง
โฟลว์เหตุการณ์
ตัวแปร
RunJS
Previous PageJS Field
Next PageJS Column
TIP

เอกสารนี้แปลโดย AI หากมีข้อมูลที่ไม่ถูกต้อง โปรดดูเวอร์ชันภาษาอังกฤษ

#JS Item

#บทนำ

JS Item ใช้สำหรับ "รายการที่กำหนดเอง" (custom items) ในฟอร์ม ซึ่งไม่ได้ผูกกับฟิลด์ใดๆ ครับ คุณสามารถใช้ JavaScript/JSX เพื่อเรนเดอร์เนื้อหาใดๆ ก็ได้ เช่น คำแนะนำ, สถิติ, การแสดงตัวอย่าง, ปุ่มต่างๆ และยังสามารถโต้ตอบกับฟอร์มและบริบทของเรคคอร์ดได้ด้วย เหมาะสำหรับสถานการณ์ที่ต้องการแสดงตัวอย่างแบบเรียลไทม์, คำแนะนำ หรือคอมโพเนนต์แบบโต้ตอบขนาดเล็กครับ

jsitem-add-20251929

#Runtime Context API (ที่ใช้บ่อย)

  • ctx.element: DOM container (ElementProxy) ของรายการปัจจุบัน รองรับ innerHTML, querySelector, addEventListener และอื่นๆ ครับ
  • ctx.form: AntD Form instance ที่สามารถใช้ getFieldValue / getFieldsValue / setFieldsValue / validateFields และอื่นๆ ได้ครับ
  • ctx.blockModel: โมเดลของบล็อกฟอร์มที่ JS Item อยู่ ซึ่งสามารถฟังเหตุการณ์ formValuesChange เพื่อสร้างการทำงานแบบเชื่อมโยง (linkage) ได้ครับ
  • ctx.record / ctx.collection: เรคคอร์ดปัจจุบันและเมตาดาต้าของ คอลเลกชัน (ใช้ได้ในบางสถานการณ์) ครับ
  • ctx.requireAsync(url): โหลดไลบรารี AMD/UMD แบบอะซิงโครนัสด้วย URL ครับ
  • ctx.importAsync(url): อิมพอร์ตโมดูล ESM แบบไดนามิกด้วย URL ครับ
  • ctx.openView(viewUid, options): เปิดวิว (view) ที่ตั้งค่าไว้ (เช่น ลิ้นชัก (drawer), กล่องโต้ตอบ (dialog), หรือหน้าเพจ) ครับ
  • ctx.message / ctx.notification: ข้อความแจ้งเตือนและประกาศแบบ Global ครับ
  • ctx.t() / ctx.i18n.t(): สำหรับการทำ Internationalization ครับ
  • ctx.onRefReady(ctx.ref, cb): เรนเดอร์หลังจากคอนเทนเนอร์พร้อมใช้งานแล้วครับ
  • ctx.libs.React / ctx.libs.ReactDOM / ctx.libs.antd / ctx.libs.antdIcons / ctx.libs.dayjs: ไลบรารีทั่วไปที่มาพร้อมกับระบบ เช่น React, ReactDOM, Ant Design, Ant Design icons และ dayjs สำหรับการเรนเดอร์ JSX และการจัดการเวลาครับ (ส่วน ctx.React / ctx.ReactDOM / ctx.antd ยังคงเก็บไว้เพื่อความเข้ากันได้)
  • ctx.render(vnode): เรนเดอร์ React element/HTML/DOM ไปยังคอนเทนเนอร์เริ่มต้น ctx.element ครับ การเรนเดอร์หลายครั้งจะใช้ Root เดิมซ้ำ และเขียนทับเนื้อหาที่มีอยู่ในคอนเทนเนอร์ครับ

#Editor และ Snippets

  • Snippets: เปิดรายการโค้ด Snippets ที่มาพร้อมกับระบบ ซึ่งคุณสามารถค้นหาและแทรกไปยังตำแหน่งเคอร์เซอร์ปัจจุบันได้ด้วยคลิกเดียวครับ
  • Run: รันโค้ดปัจจุบันโดยตรง และแสดงผลลัพธ์การทำงานในพาเนล Logs ด้านล่างครับ รองรับ console.log/info/warn/error และการไฮไลต์ตำแหน่งข้อผิดพลาดด้วยครับ

jsitem-toolbars-20251029

  • สามารถใช้ร่วมกับ AI Employee เพื่อสร้าง/แก้ไขสคริปต์ได้ครับ: AI Employee · Nathan: วิศวกร Frontend

#การใช้งานทั่วไป (ตัวอย่างแบบย่อ)

#1) การแสดงตัวอย่างแบบเรียลไทม์ (อ่านค่าจากฟอร์ม)

const render = () => {
  const { price = 0, quantity = 1, discount = 0 } = ctx.form.getFieldsValue();
  const total = Number(price) * Number(quantity);
  const final = total * (1 - Number(discount || 0));
  ctx.render(
    <div style={{ padding: 8, background: '#f6ffed', border: '1px solid #b7eb8f', borderRadius: 6 }}>
      <div style={{ fontWeight: 600, color: '#389e0d' }}>{ctx.t('Payable:')} ¥{(final || 0).toFixed(2)}</div>
    </div>
  );
};
render();
ctx.blockModel?.on?.('formValuesChange', () => render());

#2) เปิดวิว (View) (ลิ้นชัก)

ctx.render(
  <a onClick={async () => {
    const popupUid = ctx.model.uid + '-preview';
    await ctx.openView(popupUid, { mode: 'drawer', title: ctx.t('Preview'), size: 'large' });
  }}>
    {ctx.t('Open preview')}
  </a>
);

#3) โหลดและเรนเดอร์ไลบรารีภายนอก

// AMD/UMD
const dayjs = await ctx.requireAsync('https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js');
ctx.render(<span>{dayjs().format('YYYY-MM-DD HH:mm')}</span>);

// ESM
const { default: he } = await ctx.importAsync('https://cdn.jsdelivr.net/npm/he/+esm');
ctx.render(<span>{he.encode(String(ctx.form.getFieldValue('title') ?? ''))}</span>);

#ข้อควรระวัง

  • แนะนำให้ใช้ CDN ที่เชื่อถือได้สำหรับการโหลดไลบรารีภายนอกครับ และควรมีกลไกสำรองในกรณีที่เกิดข้อผิดพลาด (เช่น if (!lib) return;)
  • สำหรับ Selector แนะนำให้ใช้ class หรือ [name=...] เป็นหลักครับ และหลีกเลี่ยงการใช้ id แบบตายตัว เพื่อป้องกัน id ซ้ำกันในบล็อกหรือป๊อปอัปหลายๆ อัน
  • การจัดการ Event: การเปลี่ยนแปลงค่าในฟอร์มบ่อยครั้งจะทำให้เกิดการเรนเดอร์หลายครั้งครับ ก่อนที่จะผูก Event ควรมีการเคลียร์หรือป้องกันการซ้ำซ้อน (เช่น การ remove ก่อนแล้วค่อย add, การใช้ { once: true }, หรือการใช้ dataset เพื่อทำเครื่องหมายป้องกันการซ้ำ)

#เอกสารที่เกี่ยวข้อง

  • ตัวแปรและ Context
  • กฎการเชื่อมโยง (Linkage Rules)
  • วิว (Views) และป๊อปอัป