我是道场和春天发展的新手。我试图使用spring-mvc控制器的json响应来填充Tree小部件。我非常密切关注dojocampus网站上的例子。
首先,如果我使用本地数据源,它可以正常工作:
<script type="text/javascript">
dojo.require("dojo.data.ItemFileReadStore");
dojo.require("dijit.Tree");
dojo.addOnLoad(function() {
var rawdata = [{"rid":"b1c","name":"Test Parent","children":[{"rid":"1c4","name":"Test Child 1","children":[]},{"rid":"ee6","name":"Test Child 2","children":[]}]}];
var store = new dojo.data.ItemFileReadStore({
data: {
identifier: 'rid',
label: 'name',
items: rawdata
}
});
var treeModel = new dijit.tree.TreeStoreModel({
store: store,
query: {name: 'Test Parent'},
childrenAttrs: ["children"]
});
new dijit.Tree({
model: treeModel
},
"treeOne");
});
</script>
<div id="treeOne">
</div>
但如果我使用我的json url,树就不会出现:
<script type="text/javascript">
dojo.require("dojo.data.ItemFileReadStore");
dojo.require("dijit.Tree");
dojo.addOnLoad(function() {
var store = new dojo.data.ItemFileReadStore({
url: "/Demo2/glossaryobjects/categories.json"
});
var treeModel = new dijit.tree.TreeStoreModel({
store: store,
query: {name: 'Test Parent'},
childrenAttrs: ["children"]
});
new dijit.Tree({
model: treeModel
},
"treeOne");
});
</script>
<div id="treeOne">
</div>
当我使用Firebug进行调试时,我可以看到json响应似乎正确加载。它看起来像这样:
{“identifier”:“rid”,“items”:{“rid”:“b1c”,“name”:“Test Parent”, “孩子们”:[{“rid”:“1c4”,“name”:“Test Child 1”,“children”:[]}, {“rid”:“ee6”,“name”:“Test Child 2”,“children”:[]}]},“label”:“name”}
Firebug中存在错误:
“dijit.tree.TreeStoreModel:query {”name“:”Test Parent“}返回0项,但必须返回一项”
看起来ItemFileReadStore未正确加载。谁知道我做错了什么?我已经把头发弄了好几天试图让它发挥作用,所以任何帮助都非常感激。
干杯, 杆
答案 0 :(得分:2)
OK!问题解决了(对我来说):
如果您仔细查看每个商店生产的商店,那么两者的数据都是存在的,但商店代表商店的方式各不相同。
使用url JSON数据,你得到 _arrayofallitems [] _arrayoftoplevelitems对象{.... ID... 项目... 等
用字符串数据,你得到 _arrayofallitems [] 62项 _arrayoftoplevelitems [0] ID 项目 等
如果您截取来自xhrGet的JSON响应,并将其与字符串进行比较,您将看到JSON响应不是数组(没有[])而字符串是。
解决方案:声明一个空数组,将JSON响应推入其中, 然后将数组传递给ItemFileReadStore:
dojo.xhrGet( {
url: 'test.php',
handleAs: "json",
preventCache: 'true',
load: function(response, ioArgs){
var rawdata = [];
rawdata.push(response);
var store = new dojo.data.ItemFileReadStore({ data: {
identifier: "id",
label: "label",
items: rawdata }
});
loadtree(store);
}});
它对我有用(完成了一个沮丧的下午)......
答案 1 :(得分:0)
您提到的错误: “dijit.tree.TreeStoreModel:query {”name“:”Test Parent“}返回0项,但必须返回一项”
应该使用TreeStoreModel而不是ForestStoreModel。前者只需要为根节点返回一个项目。您的修复可能有效,因为您将其推入单个阵列。
看看: http://ofps.oreilly.com/titles/9780596516482/application_widgets.html