Now.js Framework Documentation
Select Elements (อิลิเมนต์ Dropdown)
Select Elements (อิลิเมนต์ Dropdown)
เอกสารสำหรับ SelectElementFactory และ MultiSelectElementFactory - components สำหรับ dropdown และ multi-select พร้อม type-to-filter, Ajax loading และ keyboard navigation
📋 สารบัญ
ภาพรวม
Select elements ปรับปรุง <select> elements พื้นฐานพร้อมฟีเจอร์เพิ่มเติมขณะรักษาความเข้ากันได้กับ form
| Element | data-element | คำอธิบาย |
|---|---|---|
| SelectElementFactory | select |
Enhanced select พร้อม type-to-filter |
| MultiSelectElementFactory | select-multiple |
Custom multi-select พร้อม checkbox UI |
คุณสมบัติหลัก
- ✅ Type-to-Filter: ข้ามไปยัง options ด้วยการพิมพ์
- ✅ Ajax Loading: โหลด options จาก API
- ✅ OptGroups: รองรับ grouped options
- ✅ Keyboard Navigation: รองรับ keyboard เต็มรูปแบบ
- ✅ i18n Support: แปลภาษา option labels อัตโนมัติ
SelectElementFactory
การใช้งานพื้นฐาน
<!-- Simple select -->
<select data-element="select" name="country">
<option value="">เลือกประเทศ</option>
<option value="TH">ประเทศไทย</option>
<option value="US">สหรัฐอเมริกา</option>
<option value="JP">ญี่ปุ่น</option>
</select>HTML Attributes
| Attribute | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
data-element |
string | - | ตั้งค่าเป็น select |
data-placeholder |
string | - | ข้อความ placeholder |
data-type-to-filter |
boolean | true |
เปิด type-to-filter |
data-search-method |
string | 'prefix' |
วิธีค้นหา: prefix, contains, fuzzy |
data-url |
string | - | URL สำหรับโหลด options |
data-value |
string | - | ค่าเริ่มต้นหลังโหลด options |
data-options-key |
string | - | Key สำหรับ options จาก parent data |
Type-to-Filter
เมื่อ focus ที่ select ผู้ใช้สามารถพิมพ์เพื่อข้ามไปยัง options ที่ตรงกัน:
วิธีค้นหา:
| วิธี | คำอธิบาย | ตัวอย่าง |
|---|---|---|
prefix |
ตรงจากตัวแรก | "กร" → "กรุงเทพ" |
contains |
ตรงที่ไหนก็ได้ | "เทพ" → "กรุงเทพ" |
fuzzy |
ตรงตัวอักษรตามลำดับ | "กท" → "กรุงเทพ" |
โหลด Options จาก URL
<select data-element="select"
data-url="/api/countries"
data-value="TH"
name="country">
<option value="">เลือกประเทศ</option>
</select>Expected API Response:
{
"success": true,
"data": [
{"value": "TH", "text": "ประเทศไทย"},
{"value": "US", "text": "สหรัฐอเมริกา"}
]
}JavaScript API
const instance = ElementManager.getInstance(selectElement);
// รับค่าปัจจุบัน
console.log(instance.value); // 'TH'
console.log(instance.selectedOption); // {value: 'TH', text: 'ประเทศไทย', index: 1}
// ตั้งค่า
instance.value = 'US';
// อัพเดท options
instance.updateOptions([
{value: '1', text: 'ตัวเลือก 1'},
{value: '2', text: 'ตัวเลือก 2', selected: true}
]);
// โหลด options จาก URL
await instance.loadOptions('/api/cities', {country: 'TH'});
// ล้าง options (เก็บ placeholder)
instance.clearOptions();MultiSelectElementFactory
MultiSelectElementFactory แปลง <select multiple> เป็น custom UI พร้อมปุ่ม trigger และ dropdown panel พร้อม checkboxes
การใช้งานพื้นฐาน
<select data-element="select-multiple"
multiple
name="categories[]">
<option value="1">อิเล็กทรอนิกส์</option>
<option value="2">เสื้อผ้า</option>
<option value="3">หนังสือ</option>
<option value="4">กีฬา</option>
</select>UI ที่แสดง:
- ซ่อน select ต้นฉบับ
- ปุ่ม trigger แสดงรายการที่เลือก
- Dropdown panel พร้อม check/uncheck icons
HTML Attributes
| Attribute | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
data-element |
string | - | ตั้งค่าเป็น select-multiple |
data-placeholder |
string | - | ข้อความเมื่อไม่มีการเลือก |
data-max-display-items |
number | 2 |
จำนวนสูงสุดที่แสดงก่อน "+n items" |
multiple |
boolean | required | ต้องตั้งค่า |
required |
boolean | false |
ต้องเลือกอย่างน้อย 1 รายการ |
รูปแบบการแสดง
| จำนวนที่เลือก | maxDisplayItems | แสดง |
|---|---|---|
| 0 | - | "เลือกหมวดหมู่" (placeholder) |
| 1 | 2 | "อิเล็กทรอนิกส์" |
| 2 | 2 | "อิเล็กทรอนิกส์, เสื้อผ้า" |
| 3 | 2 | "อิเล็กทรอนิกส์, เสื้อผ้า +1 items" |
JavaScript API
const instance = ElementManager.getInstance(selectElement);
// รับค่าที่เลือก
console.log(instance.getValue()); // ['1', '3']
// ตั้งค่า
instance.setValue(['1', '2', '4']);
// ล้างการเลือก
instance.clear();
// อัพเดท options
instance.updateOptions([
{value: '1', text: 'ตัวเลือกใหม่ 1'},
{value: '2', text: 'ตัวเลือกใหม่ 2'}
]);เหตุการณ์
| Event | เมื่อเกิด | Detail |
|---|---|---|
change |
เลือกเปลี่ยน | Native event |
optionschanged |
อัพเดท options | {options} |
selectElement.addEventListener('change', (e) => {
const instance = ElementManager.getInstance(e.target);
console.log('เลือก:', instance.selectedOption);
});แนวทางปฏิบัติที่ดี
1. ✅ ใส่ Placeholder เสมอ
<!-- ✅ ดี: บอกชัดว่าต้องทำอะไร -->
<select data-element="select" name="country">
<option value="">เลือกประเทศ</option>
<option value="TH">ประเทศไทย</option>
</select>2. ✅ ใช้ data-options-key สำหรับ Modal Forms
<!-- ✅ ดี: Options โหลดจาก modal data -->
<form data-form="user-edit">
<select data-element="select"
data-options-key="roles"
name="role_id">
</select>
</form>3. ✅ ใช้ Array Notation สำหรับ MultiSelect Names
<!-- ✅ ดี: Server ได้รับ array -->
<select data-element="select-multiple"
multiple
name="categories[]">
</select>
<!-- Form submission: categories[]=1&categories[]=3 -->เอกสารที่เกี่ยวข้อง
- Form Elements ภาพรวม
- ElementFactory - Base class
- Text Elements - Text inputs พร้อม autocomplete
- FormManager - Form-level management