javascript - 创建带有小胡子的动态下拉列表
问题描述
我有以下结构:
[
"key 1": [ "val1", "val2", "val3" ],
"key 2": [
"key 3": [ "val4" ],
"key 4": [ "val5" ]
]
]
我想从中生成下拉列表。“key 1”...将是可选名称,“val1”...值。如果所选键上有一个子数组,我想用这些值动态创建另一个下拉列表,直到子数组只有一个值。(例如“key 2”)
我不知道如何留胡子。我可以将第一级的所有键放入一个平面数组中,Object.keys
但我什至无法生成第一个下拉列表。更不用说我知道如何与另一部分一起去。
最好能得到一个关于如何完成的大方向。
这是一些示例代码:
const view = {
files: getFiles(),
"keys": function() {
return Object.keys(this);
}
};
<form>
<select id="selector">
<option>choose...</option>
{{#files}}
{{#keys}}
<option value="">{{.}}</option>
{{/keys}}
{{/files}}
</select>
</form>
解决方案
Mustache是一种logic-less
模板语法,因为没有 if 语句、else 子句或 for 循环。相反,只有标签。一些标签被替换为一个值,一些什么都没有,而另一些则是一系列值。
因此,您无法使用 . 根据所选值更新呈现的 HTML mustache
。
在这里,我使用onchange
事件根据先前选择的值使用没有mustache
模板的纯 Javascript 动态创建选择
var data = {
"key 1": ["val1", "val2", "val3"],
"key 2": {
"key 3": ["val4"],
"key 4": ["val5"]
}
}
function renderSelect(obj) {
var array = Array.isArray(obj) ? obj : Object.keys(obj)
var options = ['Choose', ...array].map(i => "<option>" + i + "</option>").join('')
var select = document.createElement('select')
select.innerHTML = options
if (!Array.isArray(obj)) {
select.onchange = function() {
// remove next siblings
var sib = [], el = this
while (el = el.nextElementSibling) sib.push(el)
sib.forEach(el => el.remove())
// render select based on value
renderSelect(obj[this.value])
}
}
document.querySelector('form').insertAdjacentElement('beforeend', select);
}
renderSelect(data)
<form></form>
推荐阅读
- sockets - 侦听多宿主计算机上的端口
- pdf - 在 Google Apps 脚本中使用自定义页眉或页脚将 Google 表格导出为 PDF
- postgresql - Postgres 将整数转换为文本
- javascript - js为嵌套属性生成路径字符串
- git - 获取已排序的 Git 中最新的 n 个可达标签
- android - 如何从函数类中获取字符串?
- javascript - 如何在 if 语句中返回对象值?
- c# - 如何查看 Bitmap 类组件
- dashing - 您如何知道 Dashing 小部件正在侦听哪种类型的数据作为参数?
- python - 将 lambda 应用于数据帧,但最多只能达到一定的行数