Now.js Framework Documentation
data-text
data-text
ภาพรวม
data-text เชื่อมค่าข้อมูลกับ text content ของ element เป็น directive ที่ใช้บ่อยที่สุดสำหรับแสดงข้อความแบบ dynamic
ใช้เมื่อ:
- แสดงข้อความจาก data objects
- แสดงข้อมูลผู้ใช้ labels หรือเนื้อหาแบบ dynamic
- จัดรูปแบบค่าด้วย pipes (formatters)
ทำไมต้องใช้:
- ✅ แสดงข้อความอย่างปลอดภัย (ป้องกัน XSS)
- ✅ รองรับ formatters ผ่าน pipe syntax
- ✅ Reactive - อัพเดทอัตโนมัติเมื่อข้อมูลเปลี่ยน
- ✅ รองรับ nested properties
การใช้งานพื้นฐาน
Text Binding อย่างง่าย
<span data-text="username"></span>กับข้อมูล:
{ username: "สมชาย ใจดี" }ผลลัพธ์:
<span>สมชาย ใจดี</span>Nested Properties
<span data-text="user.profile.name"></span>กับข้อมูล:
{
user: {
profile: {
name: "สมหญิง รักเรียน"
}
}
}ผลลัพธ์:
<span>สมหญิง รักเรียน</span>Syntax
<element data-text="expression | formatter1 | formatter2">| ส่วน | คำอธิบาย |
|---|---|
expression |
Data path หรือ expression ที่ต้องการประเมิน |
\| formatter |
Formatter(s) สำหรับแปลงค่า (ไม่บังคับ) |
กติกาการ parse เครื่องหมาย |
data-text จะประเมิน expression ก่อน แล้วจึงใช้ formatters ที่คั่นด้วย | เฉพาะตัวที่อยู่ระดับบนสุดของ expression เท่านั้น
|ตัวเดียวที่อยู่ระดับบนสุด จะถูกมองเป็นตัวเริ่ม formatter||ยังเป็น JavaScript fallback operator ตามปกติ|ที่อยู่ใน string จะถือเป็นข้อความ ไม่ใช่ตัวคั่น formatter|ที่อยู่ใน expression ซ้อนอย่าง(),[],{}จะยังไม่ถูกแยกจนกว่าจะกลับมาระดับบนสุด
ตัวอย่างที่ใช้ได้:
<span data-text="status || '-'"></span>
<span data-text="'Value ' + (status || '-')"></span>
<span data-text="(brand_name || '-') + ' | ' + (category_name || '-')"></span>
<span data-text="price | currency:THB"></span>arguments ของ formatter จะถูกส่งต่อเป็น string ที่คั่นด้วย : ตรงๆ ไม่ต้องใส่ quote ครอบ
<span data-text="price | currency:THB:th-TH:4"></span>
<span data-text="created_at | date:D MMM YYYY"></span>ความต่างระหว่าง || กับ default:
ใช้ || เมื่อต้องการ fallback ตามกติกา JavaScript สำหรับค่าที่เป็น falsy
<span data-text="status || '-'"></span>ใช้ default: เมื่อต้องการ fallback แบบ formatter และแทนค่าเฉพาะ null กับ undefined
<span data-text="status | default:-"></span>ความต่างสำคัญคือ:
status || '-'จะแทนค่าเมื่อเป็นnull,undefined,'',0, และfalsestatus | default:-จะแทนค่าเฉพาะnullและundefined
ฟีเจอร์
1. Property Binding อย่างง่าย
<p data-text="title"></p>
<p data-text="description"></p>2. การเข้าถึง Nested Object
<span data-text="product.category.name"></span>
<span data-text="order.customer.email"></span>3. การเข้าถึง Array Index
<span data-text="items[0].name"></span>
<span data-text="users[2].email"></span>4. Formatters (Pipes)
แปลงค่าโดยใช้ formatters:
<!-- ตัวพิมพ์ใหญ่ -->
<span data-text="name | uppercase"></span>
<!-- ตัวพิมพ์เล็ก -->
<span data-text="email | lowercase"></span>
<!-- จัดรูปแบบวันที่ -->
<span data-text="createdAt | date:D MMM YYYY"></span>
<!-- จัดรูปแบบตัวเลข -->
<span data-text="price | number:2"></span>
<!-- สกุลเงิน -->
<span data-text="total | currency:THB:th-TH:4"></span>5. Chained Formatters
<span data-text="name | lowercase | capitalize"></span>ตัวอย่างขั้นสูง
บัตรโปรไฟล์ผู้ใช้
<div class="profile-card">
<h2 data-text="user.name"></h2>
<p class="email" data-text="user.email | lowercase"></p>
<p class="joined">
สมาชิกตั้งแต่: <span data-text="user.createdAt | date:MMMM YYYY"></span>
</p>
<p class="status" data-text="user.status | uppercase"></p>
</div>การแสดงสินค้า
<div class="product">
<h3 data-text="product.name"></h3>
<p class="price" data-text="product.price | currency:THB"></p>
<p class="stock">
ในสต็อก: <span data-text="product.quantity | number"></span>
</p>
<p class="category" data-text="product.category.name"></p>
</div>ภายใน data-for Loop
<ul data-for="item in items">
<template>
<li>
<span class="index" data-text="index + 1"></span>.
<span class="name" data-text="item.name"></span>
<span class="price" data-text="item.price | currency"></span>
</li>
</template>
</ul>กับ Fallback Values
<span data-text="user.nickname || user.name || 'ไม่ระบุชื่อ'"></span><span data-text="user.nickname | default:ไม่ระบุชื่อ"></span>API อ้างอิง
Expressions ที่รองรับ
| Expression | ตัวอย่าง | คำอธิบาย |
|---|---|---|
| Property ธรรมดา | data-text="name" |
เข้าถึง state property |
| Nested property | data-text="user.name" |
เข้าถึง nested object |
| Array index | data-text="items[0]" |
เข้าถึง array element |
| Expression | data-text="index + 1" |
ประเมิน expression |
| Fallback | data-text="a \|\| b" |
ใช้ fallback ถ้าเป็น falsy |
Built-in Formatters
| Formatter | การใช้งาน | คำอธิบาย |
|---|---|---|
uppercase |
\| uppercase |
แปลงเป็นตัวพิมพ์ใหญ่ |
lowercase |
\| lowercase |
แปลงเป็นตัวพิมพ์เล็ก |
capitalize |
\| capitalize |
ทำตัวอักษรตัวแรกให้เป็นตัวพิมพ์ใหญ่ |
humanize |
\| humanize |
แปลง identifier ให้อ่านง่าย |
date |
\| date:format |
จัดรูปแบบวันที่ |
datetime |
\| datetime:format |
จัดรูปแบบวันและเวลา |
time |
\| time:format |
จัดรูปแบบเวลา |
number |
\| number:decimals |
จัดรูปแบบตัวเลข |
currency |
\| currency:code[:locale[:decimals]] |
จัดรูปแบบเป็นสกุลเงิน |
percent |
\| percent:decimals |
จัดรูปแบบเปอร์เซ็นต์ |
default |
\| default:value |
แทนค่าเฉพาะ null หรือ undefined |
ข้อควรระวัง
⚠️ 1. อย่าใช้กับ HTML Content
<!-- ❌ ผิด - HTML จะถูก escape -->
<div data-text="htmlContent"></div>
<!-- ผลลัพธ์: <strong>Bold</strong> -->
<!-- ✅ ถูก - ใช้ data-html -->
<div data-html="htmlContent"></div>⚠️ 2. ตัวพิมพ์ใหญ่-เล็กใน Property Path
<!-- ❌ ผิด - ตัวพิมพ์ไม่ตรง -->
<span data-text="user.Name"></span> <!-- ไม่ทำงานถ้า data มี 'name' -->
<!-- ✅ ถูก - ตรงกับชื่อ property จริง -->
<span data-text="user.name"></span>⚠️ 3. การเข้าถึง Properties ที่ไม่มี
<!-- ❌ อาจแสดง 'undefined' -->
<span data-text="user.address.city"></span>
<!-- ✅ ใช้ optional chaining หรือ fallback -->
<span data-text="user.address?.city || 'ไม่ระบุ'"></span>⚠️ 4. เลือกชนิด fallback ให้ตรงความหมาย
<!-- จะทับ 0 และ false ด้วย เพราะ || ใช้กติกา falsy ของ JavaScript -->
<span data-text="qty || '-'"></span>
<!-- จะคง 0 และ false ไว้ และแทนค่าเฉพาะ null/undefined -->
<span data-text="qty | default:-"></span>