为什么我的dijit.Tree没有填充json源?

时间:2010-09-20 08:08:00

标签: json spring-mvc dojo

我是道场和春天发展的新手。我试图使用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未正确加载。谁知道我做错了什么?我已经把头发弄了好几天试图让它发挥作用,所以任何帮助都非常感激。

干杯, 杆

2 个答案:

答案 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