Skip to content

State 與 Events

State

getState() 回傳唯讀的 SelkitState。訂閱者會在每次變更時收到它。

欄位型別說明
isOpenboolean下拉是否開啟。
querystring目前搜尋字串。
activeIndexnumbervisibleOptions 中 highlight 的索引,或 -1
selectedSelkitOption<T>[]已選選項(單選長度 0–1,多選 0–n)。
visibleOptionsSelkitOption<T>[]目前顯示、過濾且扁平化的選項。
loadingboolean初次非同步載入進行中。
noResultsboolean非載入中且 visibleOptions 為空(非僅是未達 minInputLength)。
disabledboolean控制項是否停用。
pagenumber分頁已載入的頁碼(從 1 起;載入前為 0)。
hasMoreboolean是否還能載入下一頁。
loadingMoreboolean追加下一頁中(與 loading 區分)。

Events

on(event, handler) 訂閱。

事件Payload觸發時機
openvoid下拉開啟。
closevoid下拉關閉。
change{ selected, value }選取變更(select / deselect / clear / tag / 重排)。
search{ query }透過 setQuery 變更查詢。
highlight{ index, option }highlight 的選項變更。
load:start{ query }非同步載入開始。
load:end{ options }非同步載入完成。
load:error{ error }非同步載入失敗。
create{ option }建立 tag。
announce{ message }應朗讀的螢幕報讀訊息(選取/結果數變化)。adapter 會自動寫入 aria-live region。
js
controller.on('change', ({ selected, value }) => {
  console.log(value, selected)
})

controller.on('load:error', ({ error }) => {
  console.error('load failed', error)
})

a11y 屬性

a11y() 回傳 adapter 套用到 markup 上的屬性:

ts
interface SelkitA11y {
  trigger: {
    role: 'combobox'
    'aria-expanded': boolean
    'aria-controls': string
    'aria-haspopup': 'listbox'
    'aria-activedescendant'?: string
    'aria-disabled'?: boolean
  }
  listbox: {
    role: 'listbox'
    id: string
    'aria-multiselectable'?: boolean
  }
  option(index: number): {
    role: 'option'
    id: string
    'aria-selected': boolean
    'aria-disabled'?: boolean
  }
}

live 公告

除了靜態 ARIA 屬性,每個 adapter 都會渲染一個視覺隱藏的 aria-live="polite" region,並把 announce 訊息寫入,讓螢幕報讀朗讀選取與結果數變化。文字可用 selected / deselected / cleared / resultsCountmessages 自訂。預設開啟,無需設定。

請用 ariaLabel(或 placeholder,會被當作後備)為搜尋 輸入框設定可及名稱,讓螢幕報讀能辨識欄位。各 adapter 在測試中以 axe-core 檢查無障礙違規。

依 MIT 授權釋出。