# Package & Rule & Locale
是一種封裝驗證規則與語系的資料結構,可以獨立宣告更頂層的驗證規則與語系訊息。
注意
name
參數是唯一值,註冊在後必須透過 #{name}.{target}
去獲得指定的規則或是訊息,務必注意到命名的衝突。
const alas = new Alas({
packages: [
{
name: 'my',
rules: {
number(model: Model, value: any) {
const type = model.$utils.getType(value)
// 驗證結果可以透過 $meg 來返回不同的錯誤訊息
return type === 'number' ? true : model.$meg('#my.notNumber')
})
},
locales: {
'zh-tw': {
'notNumber': '不是數字'
}
}
}
]
})
# Types
PackageOptions
是輔助你定義 package 的好幫手。
import { PackageOptions } from 'alas'
const myPackage: PackageOptions = {
name: 'my'
}
# Rule
規則是一種驗證方法,將值傳給一個 function,並回傳 true
或是 string
(錯誤訊息)。
function number(model: Model, value: any) {
let type = model.$utils.getType(value)
return type === 'number' ? true : 'Value must be a number.'
})
# Params
Rule 可以接受簡單的參數來賦予更靈活的宣告方法,加入參數的方法是透過 | 符號切割參數的鍵值,使用 : 符號定義指定值,例如:max|value:20
,獲取的對象將傳遞給第二個參數。
function max(model: Model, value: any, params: { [key: string]: string }) {
if (params.value && value > Number(params.value)) {
return `Value more then ${params.value}.`
}
return true
}
# 所有的方法都會忽略空值
空值 ( null or undefined ) 不做驗證,可以用以下結構使空值也做檢查。
let packageOptions = {
rules: {
max: {
handler: (model: Model, value) => { ... },
required: true // 透過 required 使驗證必須不計空值
}
}
}
# Locale
身為 view model 的特性,我們必須呈現將訊息呈現給各種語言的客戶,但由於 Alas 具有封裝性,因此本身也必須要有語系的系統:
# Params
輸出的 message 允許加入動態元素,使用{}
符號作為更動目標。
提醒
注意 {} 不能有空格
let packageOptions = {
name: 'my',
locales: {
'en-us': {
'age': '{value} years old.'
},
'zh-tw': {
'age': '年齡為{value}歲'
}
}
}
# 切換語系
語系默認為 en-us
,可以使用以下方法更換顯示狀態。
console.log(alas.meg('#my.age', { value: 20 })) // 20 years old.
// 切換成中文
alas.setLocale('zh-tw')
console.log(alas.meg('#my.age', { value: 20 })) // 年齡為20歲.
// 未定義情境下,會顯示英文
alas.setLocale('zh-cn')
console.log(alas.meg('#my.age', { value: 20 })) // 20 years old.
// 連英文也未定義情境下,回傳key值
console.log(alas.meg('#my.hw')) // #my.hw
# MS
MS 是一個 MetalSheep
官方配件包,本身已經註冊在 Core 內不需要額外引用,你可以參考原始碼 (opens new window)來了解應用,而這個套件包佔據了 ms
關鍵名稱。
# 擴充語系
MS 本身提供了 en-us
與 zh-tw
兩個語系,你可以從以下方法訪問到該 Package 物件,可用於擴充語系:
import Alas from 'alas'
Alas.MsPackage.locales['ja'] = {
'required': '必須'
}
# Container
container 本身的 model 如果要去獲取規則或是訊息是可以忽視掉前贅命名的,但如果跨 container
可以透過 ${containerName}.{target}
去獲得,但我們不推薦就是了。