Now.js Framework Documentation
Form Elements (ฟอร์มอิลิเมนต์) - ภาพรวม
Form Elements (ฟอร์มอิลิเมนต์) - ภาพรวม
คู่มือฉบับสมบูรณ์สำหรับ Form Elements ใน Now.js Framework - input components ที่เพิ่มความสามารถด้าน validation, formatting และการจัดการเหตุการณ์
📋 สารบัญ
- ภาพรวม
- สถาปัตยกรรม
- เริ่มต้นใช้งานอย่างรวดเร็ว
- ประเภทของ Element
- คู่มือเลือกอย่างรวดเร็ว
- คุณสมบัติทั่วไป
- การลงทะเบียน Element
- เอกสารที่เกี่ยวข้อง
ภาพรวม
Form Elements ใน Now.js คือ input components ที่สร้างบน ElementFactory base class ให้ validation, formatting, การจัดการสถานะ และการจัดการเหตุการณ์อัตโนมัติ - ตั้งค่าได้ทั้งหมดผ่าน HTML data attributes
คุณสมบัติหลัก
- ✅ Declarative Configuration: ตั้งค่าผ่าน HTML
data-*attributes - ✅ Auto-Enhancement: HTML inputs ที่มีอยู่ถูกปรับปรุงอัตโนมัติ
- ✅ Validation System: รองรับ built-in และ custom validation rules
- ✅ Formatting: จัดรูปแบบ input/output อัตโนมัติ
- ✅ State Management: ติดตามสถานะ valid, modified, error
- ✅ Event System: เหตุการณ์สม่ำเสมอทุก element
- ✅ Wrapper Support: สร้าง label, container, comment ให้อัตโนมัติ
- ✅ FormManager Integration: ทำงานร่วมกับ FormManager ได้อย่างไร้รอยต่อ
วิธีการทำงาน
HTML Input → ElementManager ตรวจพบ data-element →
Factory ที่เหมาะสมปรับปรุง element → Instance พร้อม API เต็มรูปแบบสถาปัตยกรรม
Class Hierarchy
ElementFactory (Base Class)
├── TextElementFactory # data-element="text"
│ ├── EmailElementFactory # data-element="email"
│ ├── UrlElementFactory # data-element="url"
│ └── UsernameElementFactory # data-element="username"
├── PasswordElementFactory
├── SearchElementFactory
├── NumberElementFactory
│ └── CurrencyElementFactory
├── MaskElementFactory
│ └── TelElementFactory
├── SelectElementFactory
├── MultiSelectElementFactory
├── TextareaElementFactory
├── RichTextElementFactory
├── FileElementFactory
├── DateElementFactory
├── ColorElementFactory
├── RangeElementFactory
└── TagsElementFactoryส่วนประกอบหลัก
| ส่วนประกอบ | จุดประสงค์ |
|---|---|
ElementFactory |
Base class ที่มี validation, state, events |
ElementManager |
ทะเบียน element และตัวประสาน auto-enhancement |
FormManager |
Validation และการส่ง form ระดับฟอร์ม |
FormError |
แสดงและจัดการข้อผิดพลาด |
เริ่มต้นใช้งานอย่างรวดเร็ว
การใช้งานพื้นฐานใน HTML
เพียงใส่ data-element attribute ก็เปิด auto-enhancement:
<!-- Text input พร้อม autocomplete -->
<input type="text"
data-element="text"
data-autocomplete="true"
data-source="/api/cities"
name="city"
placeholder="เลือกจังหวัด">
<!-- Number input พร้อม formatting -->
<input type="text"
data-element="number"
data-precision="2"
data-use-grouping="true"
name="price"
placeholder="0.00">
<!-- Currency input ทศนิยม 4 ตำแหน่ง -->
<input type="currency"
step="0.0001"
data-decimals="4"
name="unit_cost"
placeholder="0.0000">
<!-- Password พร้อม strength meter -->
<input type="password"
data-element="password"
data-strength-meter="true"
name="password">
<!-- Date picker -->
<input type="text"
data-element="date"
data-format="d/m/Y"
name="birthdate">
<!-- Select พร้อม type-to-filter -->
<select data-element="select" name="country">
<option value="">เลือกประเทศ</option>
<option value="TH">ประเทศไทย</option>
<option value="US">สหรัฐอเมริกา</option>
</select>การเข้าถึงด้วย JavaScript
// รับ instance ที่ปรับปรุงแล้ว
const cityInput = document.querySelector('[name="city"]');
const instance = ElementManager.getInstance(cityInput);
// ใช้ API ของ instance
instance.element.value = 'กรุงเทพ';
instance.validate();
console.log(instance.isValid()); // true/false
console.log(instance.isModified()); // true/false
// รับฟังเหตุการณ์
cityInput.addEventListener('change', (e) => {
console.log('ค่าใหม่:', e.target.value);
});ประเภทของ Element
ตารางอ้างอิงอย่างรวดเร็ว
| ประเภท | data-element | คำอธิบาย | เอกสาร |
|---|---|---|---|
| Text | text |
Text input พร้อม autocomplete | text-elements.md |
email |
Text input พร้อมตรวจสอบ email | text-elements.md | |
| Url | url |
Text input พร้อมตรวจสอบ URL | text-elements.md |
| Username | username |
Text input พร้อมกฎของชื่อผู้ใช้ | text-elements.md |
| Password | password |
Password พร้อม strength meter | text-elements.md |
| Search | search |
Search พร้อม debounce | text-elements.md |
| Number | number |
Number พร้อม formatting | number-elements.md |
| Currency | currency |
จัดรูปแบบสกุลเงิน | number-elements.md |
| Select | select |
Enhanced select | select-elements.md |
| MultiSelect | select-multiple |
เลือกได้หลายรายการ | select-elements.md |
| Date | date |
Date picker | date-elements.md |
| Datetime | datetime-local |
Date picker พร้อมเวลา | date-elements.md |
| File | file |
อัปโหลดไฟล์ | FileElementFactory.md |
| Color | color |
Color picker | special-elements.md |
| Range | range |
Range slider | special-elements.md |
| Tags | tags |
Tags/chips input | special-elements.md |
| Mask | mask |
Input masking | special-elements.md |
| Tel | tel |
เบอร์โทรศัพท์ | special-elements.md |
| Textarea | textarea |
Textarea ปรับขนาดอัตโนมัติ | special-elements.md |
| RichText | richtext |
ตัวแก้ไขข้อความแบบ rich text | special-elements.md |
คู่มือเลือกอย่างรวดเร็ว
ควรใช้ Element ประเภทไหน?
| สถานการณ์ | Element | เพราะอะไร |
|---|---|---|
| ชื่อผู้ใช้/อีเมล | text |
Text พื้นฐานพร้อม validation |
| Autocomplete จากรายการ | text + data-autocomplete |
มี autocomplete ในตัว |
| กรอกรหัสผ่าน | password |
มี strength meter, สลับการมองเห็น |
| ช่องค้นหา | search |
หน่วงการพิมพ์ (debounce) |
| ราคา/จำนวน | number |
จัดรูปแบบ, ปุ่มเพิ่มลด |
| จำนวนเงิน | currency |
จัดรูปแบบสกุลเงิน |
| เลือกจาก dropdown | select |
Type-to-filter, โหลดผ่าน ajax |
| เลือกได้หลายรายการ | select-multiple |
Custom multi-select UI |
| วันที่/เวลา | date |
ปฏิทินให้เลือก |
| อัปโหลดไฟล์ | file |
ลากวาง, พรีวิว |
| เลือกสี | color |
จานสีให้เลือก |
| ค่าแบบ slider | range |
ช่วงเดี่ยว/ช่วงคู่ |
| รายการ tag | tags |
เพิ่ม/ลบ chips |
| เบอร์โทรศัพท์ | tel หรือ mask |
จัดรูปแบบอัตโนมัติ |
| ข้อความยาว | textarea |
ปรับขนาดอัตโนมัติ |
คุณสมบัติทั่วไป
Form Elements ทั้งหมดมีคุณสมบัติร่วมเหล่านี้จาก ElementFactory:
1. Validation
<!-- ตรวจสอบว่าต้องกรอก -->
<input data-element="text" required>
<!-- ตรวจสอบด้วย pattern -->
<input data-element="text" pattern="[A-Za-z]+">
<!-- ตรวจสอบความยาว -->
<input data-element="text" minlength="3" maxlength="50">
<!-- กฎ validation กำหนดเอง -->
<input data-element="text" data-validate="required,email">
<!-- ข้อความผิดพลาดกำหนดเอง -->
<input data-element="text"
data-validate="required"
data-error-required="กรุณากรอกอีเมลของคุณ">2. การจัดการสถานะ
const instance = ElementManager.getInstance(element);
// ตรวจสอบสถานะ
instance.isValid(); // ค่าถูกต้องหรือไม่?
instance.isModified(); // ค่าถูกแก้ไขแล้วหรือไม่?
instance.getError(); // รับข้อความผิดพลาดปัจจุบัน
// ตรวจสอบซ้ำและรีเซ็ต
instance.validate(); // ตรวจสอบค่าปัจจุบัน
instance.reset(); // คืนค่าและ config เดิม
instance.cleanup(); // ถอด handler และล้างข้อผิดพลาดของฟิลด์ตัวสถานะจริงเก็บอยู่ใน WeakMap ชื่อ ElementFactory._privateState ไม่ได้อยู่บน instance จึงต้องอ่านผ่านสามเมธอดด้านบน
3. เหตุการณ์
ทุก element ส่งเหตุการณ์ change และ input แบบ native และมีสาม factory ที่ส่งต่อการเปลี่ยนค่าเข้าสู่ event system ของแอปด้วย EventManager.emit():
| Event | ส่งโดย | Detail |
|---|---|---|
change |
ทุก element | Native DOM event |
input |
ทุก element | Native DOM event |
element:change |
DateElementFactory | {elementId, value, type: 'date'} |
element:change |
ColorElementFactory | {elementId, value, type: 'color'} |
element:change |
RangeElementFactory | {elementId, values, type: 'range'} |
EventManager.emit() ไม่ได้ dispatch DOM event ดังนั้น element:change ต้องรับฟังผ่าน EventManager.on() - addEventListener('element:change') จะไม่ทำงาน
element.addEventListener('change', (e) => {
const instance = ElementManager.getInstance(e.target);
console.log('ค่า:', e.target.value);
console.log('ถูกต้อง:', instance.isValid());
});
EventManager.on('element:change', (data) => {
console.log(data.elementId, data.value, data.type);
});4. โครงสร้าง Wrapper
Elements สร้างโครงสร้าง wrapper ให้อัตโนมัติได้:
<!-- ก่อนปรับปรุง -->
<input data-element="text"
data-wrapper="label"
data-label="ชื่อผู้ใช้"
data-comment="3-20 ตัวอักษร">
<!-- หลังปรับปรุง -->
<label class="form-control">
<span class="label-text">ชื่อผู้ใช้</span>
<input type="text" ...>
<span class="comment">3-20 ตัวอักษร</span>
</label>5. Data Binding
<!-- ผูกกับข้อมูลของ FormManager -->
<input data-element="text"
data-attr="value:user.name"
name="name">การลงทะเบียน Element
ElementManager ทำงานอย่างไร
// Elements ลงทะเบียนตัวเอง
ElementManager.registerElement('text', TextElementFactory);
ElementManager.registerElement('number', NumberElementFactory);
ElementManager.registerElement('password', PasswordElementFactory);
// ... ฯลฯ
// Auto-enhancement ตอนโหลดหน้า
document.querySelectorAll('[data-element]').forEach(el => {
const type = el.dataset.element;
const factory = ElementManager.getFactory(type);
if (factory) {
factory.enhance(el);
}
});ลงทะเบียน Element กำหนดเอง
// สร้าง factory กำหนดเอง
class PhoneElementFactory extends TextElementFactory {
static config = {
...TextElementFactory.config,
type: 'tel',
format: 'xxx-xxx-xxxx'
};
static setupElement(instance) {
// Setup กำหนดเอง
}
}
// ลงทะเบียนกับ ElementManager
ElementManager.registerElement('phone', PhoneElementFactory);ดูคู่มือฉบับเต็มที่ สร้าง Custom Elements
เอกสารที่เกี่ยวข้อง
เอกสารหลัก
- ElementFactory - เอกสาร Base class
- FormManager - การจัดการระดับฟอร์ม
- FormError - การจัดการข้อผิดพลาด
กลุ่มของ Element
- Text Elements - Text, Password, Search
- Number Elements - Number, Currency
- Select Elements - Select, MultiSelect
- Date Elements - Date picker
- Special Elements - Color, Range, Tags, Mask, Textarea
- สร้าง Custom Elements - สร้างของคุณเอง
ส่วนประกอบที่เกี่ยวข้อง
- FileElementFactory - อัปโหลดไฟล์
- EditInPlaceManager - แก้ไขในหน้า