field-select
field 的外壳包住一个原生 select。超过十个选项时,这个 select 会启用 select.js 里可筛选的组合框;但表单提交的仍然是那个原生 select。
三个选项:原生 select
把这段放进 <section rst-box><form rst-form> 里。
<div rst-field >
<label rst-field-label for ="sel_few" >角色</label >
<select rst-input id ="sel_few" name ="sel_few" >
<option value ="admin" selected >管理员</option >
<option value ="editor" >编辑者</option >
<option value ="member" >成员</option >
</select >
</div >
把这段放进 <section rst-box><form rst-form> 里。
{{ template "field-select" dict
"ID" "sel_few"
"Name" "sel_few"
"Label" "角色"
"Options" (list
(dict "Label" "管理员" "Selected" true "Value" "admin" )
(dict "Label" "编辑者" "Value" "editor" )
(dict "Label" "成员" "Value" "member" ))}}
十二个选项:可筛选的组合框
把这段放进 <section rst-box><form rst-form> 里。
<div rst-field >
<label rst-field-label for ="sel_many" >城市</label >
<select rst-input id ="sel_many" name ="sel_many" data-rst-select data-rst-select-filter ="输入以筛选" data-rst-select-results ="{n} 个结果" data-rst-select-result-one ="1 个结果" data-rst-select-no-matches ="没有匹配的结果" aria-describedby ="sel_many-help" >
<option value ="dublin" selected >都柏林</option >
<option value ="lisbon" >里斯本</option >
<option value ="madrid" >马德里</option >
<option value ="berlin" >柏林</option >
<option value ="rome" >罗马</option >
<option value ="athens" >雅典</option >
<option value ="helsinki" >赫尔辛基</option >
<option value ="reykjavík" >雷克雅未克</option >
<option value ="warsaw" >华沙</option >
<option value ="zagreb" >萨格勒布</option >
<option value ="tallinn" >塔林</option >
<option value ="valletta" >瓦莱塔</option >
</select >
<p rst-field-help id ="sel_many-help" >开始输入即可筛选。</p >
</div >
把这段放进 <section rst-box><form rst-form> 里。
{{ template "field-select" dict
"ID" "sel_many"
"Name" "sel_many"
"Label" "城市"
"Options" (list
(dict "Label" "都柏林" "Selected" true "Value" "dublin" )
(dict "Label" "里斯本" "Value" "lisbon" )
(dict "Label" "马德里" "Value" "madrid" )
(dict "Label" "柏林" "Value" "berlin" )
(dict "Label" "罗马" "Value" "rome" )
(dict "Label" "雅典" "Value" "athens" )
(dict "Label" "赫尔辛基" "Value" "helsinki" )
(dict "Label" "雷克雅未克" "Value" "reykjavík" )
(dict "Label" "华沙" "Value" "warsaw" )
(dict "Label" "萨格勒布" "Value" "zagreb" )
(dict "Label" "塔林" "Value" "tallinn" )
(dict "Label" "瓦莱塔" "Value" "valletta" ))
"Help" "开始输入即可筛选。" }}
超过十个选项,片段就会启用 select.js;不到十个就不会:在几项之间搜索只是摆设,不是帮助。
十二个选项,Plain:明确不要增强
把这段放进 <section rst-box><form rst-form> 里。
<div rst-field >
<label rst-field-label for ="sel_plain" >城市</label >
<select rst-input id ="sel_plain" name ="sel_plain" >
<option value ="dublin" selected >都柏林</option >
<option value ="lisbon" >里斯本</option >
<option value ="madrid" >马德里</option >
<option value ="berlin" >柏林</option >
<option value ="rome" >罗马</option >
<option value ="athens" >雅典</option >
<option value ="helsinki" >赫尔辛基</option >
<option value ="reykjavík" >雷克雅未克</option >
<option value ="warsaw" >华沙</option >
<option value ="zagreb" >萨格勒布</option >
<option value ="tallinn" >塔林</option >
<option value ="valletta" >瓦莱塔</option >
</select >
</div >
把这段放进 <section rst-box><form rst-form> 里。
{{ template "field-select" dict
"ID" "sel_plain"
"Name" "sel_plain"
"Label" "城市"
"Options" (list
(dict "Label" "都柏林" "Selected" true "Value" "dublin" )
(dict "Label" "里斯本" "Value" "lisbon" )
(dict "Label" "马德里" "Value" "madrid" )
(dict "Label" "柏林" "Value" "berlin" )
(dict "Label" "罗马" "Value" "rome" )
(dict "Label" "雅典" "Value" "athens" )
(dict "Label" "赫尔辛基" "Value" "helsinki" )
(dict "Label" "雷克雅未克" "Value" "reykjavík" )
(dict "Label" "华沙" "Value" "warsaw" )
(dict "Label" "萨格勒布" "Value" "zagreb" )
(dict "Label" "塔林" "Value" "tallinn" )
(dict "Label" "瓦莱塔" "Value" "valletta" ))
"Plain" true }}
必填,并带错误
把这段放进 <section rst-box><form rst-form> 里。
<div rst-field >
<label rst-field-label for ="sel_error" >角色</label >
<select rst-input id ="sel_error" name ="sel_error" required aria-invalid ="true" aria-describedby ="sel_error-error" >
<option value ="admin" selected >管理员</option >
<option value ="editor" >编辑者</option >
<option value ="member" >成员</option >
</select >
<p rst-field-error id ="sel_error-error" role ="alert" >请为此人选择一个角色。</p >
</div >
把这段放进 <section rst-box><form rst-form> 里。
{{ template "field-select" dict
"ID" "sel_error"
"Name" "sel_error"
"Label" "角色"
"Options" (list
(dict "Label" "管理员" "Selected" true "Value" "admin" )
(dict "Label" "编辑者" "Value" "editor" )
(dict "Label" "成员" "Value" "member" ))
"Required" true
"Error" "请为此人选择一个角色。" }}
手写的,带 optgroup 分组
把这段放进 <section rst-box><form rst-form> 里。
<div rst-field >
<label rst-field-label for ="sel_grouped" >地区</label >
<select rst-input id ="sel_grouped" name ="sel_grouped" data-rst-select data-rst-select-filter ="输入以筛选" data-rst-select-results ="{n} 个结果" data-rst-select-result-one ="1 个结果" data-rst-select-no-matches ="没有匹配的结果" >
<optgroup label ="欧洲" >
<option value ="dublin" selected >都柏林</option >
<option value ="lisbon" >里斯本</option >
<option value ="warsaw" >华沙</option >
</optgroup >
<optgroup label ="美洲" >
<option value ="montreal" >蒙特利尔</option >
<option value ="lima" >利马</option >
<option value ="austin" >奥斯汀</option >
</optgroup >
<optgroup label ="亚洲" >
<option value ="osaka" >大阪</option >
<option value ="hanoi" >河内</option >
<option value ="dhaka" >达卡</option >
</optgroup >
<optgroup label ="非洲" >
<option value ="accra" >阿克拉</option >
<option value ="nairobi" >内罗毕</option >
<option value ="tunis" >突尼斯</option >
</optgroup >
</select >
</div >
这里的 Options 是一个扁平列表,所以分组的选项要由应用自己写成标记。select.js 会把分组渲染出来而不是丢掉;手写的 select 也可以用 data-rst-select="false" 彻底拒绝增强。