复杂的 JSON 结构 + 道场选择
Complex JSON structure + Dojo Selects
我有一个数据结构,我不知道如何正确管理它。我必须使用 Dojo,所以我选择了 JSON 来解决这个问题。我正在谈论的结构在这篇文章的底部。在阅读以下文本之前,请先检查一下。
问题:我必须有 3 个选择。第一个选择将包含"第一级"(a,b,c)。第二个将包含"第二级"(aa,ab,...)等等。
每个选择中的数据(第一个除外)应根据上一个选择中选择的内容而有所不同。
例如,如果我在第一个选择中选择"a",我应该只在第二个选择中看到"aa,ab,ac"。然后,如果我在第二个中选择"ac",我应该只看到"aca,acb,acc"。
请注意,在某些情况下没有"第三级"。在这种情况下,第三个选择应该被隐藏(或者如果它太难管理,就为空)。
现在参考。如果我在第一个选择中选择"d",我应该只看到"aa,bc,ca"作为第二个选择的选项。然后,如果我在第二个选择中选择"cc",我应该在第三个选择中看到"cca,ccb,ccc"。当然,这不应该是静态的。在我的示例中,如果"c -> cc"子树将更改,则"d -> cc"的内容也应更改。
现在来回答问题:
1) 如何使用 Dojo 制作类似的东西?如果是香草JS,那对我来说是显而易见的,但是我不知道如何使其与所有这些对象存储之类的东西一起工作。
2)如何使引用与这种结构一起工作?我可以让它在一个简单的 JSON 上工作,但是当它变得如此复杂时,我完全迷失了。
3) 如何呈现结构?作为单个 JSON?还是我应该把它分成几个部分?
提前感谢!
a
aa
aaa
aab
ab
aba
ac
aca
acb
acc
b
ba
bb
bc
bca
c
ca
caa
cab
cb
cba
cbb
cc
cca
ccb
ccc
d
<ref to aa subtree>
<ref to bc subtree>
<ref to ca subtree>
好吧,你可以把它表示为一个对象,例如:
var myData = {
a: {
aa: ['aaa', 'aab'],
ab: ['aba'],
ac: ['aca', 'acb', 'acc']
},
b: {
ba: null,
bb: null,
bc: ['bca']
},
c: {
ca: ['caa', 'cab'],
cb: ['cba', 'cbb'],
cc: ['cca', 'ccb', 'ccc']
},
d: {}
};
myData.d.aa = myData.a.aa;
myData.d.bc = myData.b.bc;
myData.d.ca = myData.c.ca;
但无论如何,实现也会非常复杂。首先,我建议编写一个函数,根据参数获取每个级别的标签。例如:
var getObjectData = function(object) {
var data = [];
for (var key in object) {
if (object.hasOwnProperty(key)) {
data.push({
name: key,
value: object[key]
});
}
}
return data;
};
var getData = function(obj) {
var data = [];
if (obj === undefined) {
return getObjectData(myData);
} else if (obj instanceof Array) {
return obj.map(function(value) {
return {
name: value,
value: null
};
});
} else {
return getObjectData(obj);
}
return data;
};
这将返回存储内应该可用的正确数据,其中包含标签("a","b","c",...)和下一级的对象结构。
然后你可以写这样的东西:
registry.byId("level1").setStore(new ObjectStore({
objectStore: new Memory({
data: getData(),
idProperty: 'name'
})
}));
var getNextLevel = function(value) {
var data = getData(this.store.objectStore.get(value).value);
if (this.nextLevel) {
if (data.length > 0) {
domStyle.set(registry.byId(this.nextLevel).domNode, "display", "inline-table");
registry.byId(this.nextLevel).setStore(new ObjectStore({
objectStore: new Memory({
data: data,
idProperty: 'name'
})
}));
} else {
domStyle.set(registry.byId(this.nextLevel).domNode, "display", "none");
}
}
};
registry.byId("level1").on("change", getNextLevel);
registry.byId("level2").on("change", getNextLevel);
这将在值更改时检索数据(使用前面的函数),然后它将使用该数据填充下一级的存储。
不过,这还不是一个完整的解决方案。因为您仍然需要做一些初始化,但它可以让您了解如何处理这种情况。
示例:http://jsfiddle.net/ekoronra/
- 下拉选择可自动更改第二个下拉选择
- 如何使用jQuery选择下拉列表的值
- 复杂的 JSON 结构 + 道场选择
- Jquery选择层次结构
- 在angular.js中选择取消选择树结构
- 我想将一组jquery选择器存储为要延迟评估的数据结构
- 正确的选择器字符串是什么,可以在像这样结构的 HTML 中获取我想要的特定元素
- JavaScript 中多项选择测验的最佳数据结构
- jQuery 选择结构深处的元素未找到
- 在更改函数后使用 jQuery 选择对象,修改了需要选择的元素的 html 结构
- Typeahead选择支持树状结构的列表
- MongoDB是存储JSON结构的好选择吗
- 从Javascript嵌套数组/数据结构中选择随机项
- Js动态树插件
- 结构-禁用单选按钮选择,如果它的根节点
- 如何从多个JSON对象中选择一个并在python中导航其层次结构
- 获取具有多个结构和相同类选择器的html值
- NoSQL数据结构选择字段子集与Firebase和查询
- 按Window和Attr url的类选择层次结构元素
- 在ul - li层次结构中选择td的所有innerHTML
- 使用javascript和jquery,用数组结构填充相关的选择框