2010-09-20 72 views
0

我是道场和春季发展的新手。我正在尝试使用spring-mvc控制器的json响应来填充Tree小部件。我正在密切关注dojocampus网站上的例子。为什么我的dijit.Tree没有从json源码填充?

首先,如果我使用本地数据源,它的工作原理确定:

<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”, “children”:[{“rid” :“1c4”,“name”:“Test Child 1”,“children”:[]}, {“rid”:“ee6”,“name”:“Test Child 2”,“children”:[]} ]}, “标签”: “名字”}

有萤火虫的错误:

“dijit.tree.TreeStoreModel:查询{” 名 “:” 测试父“}返回0的项目,但必须只返回一个项目“

它看起来像ItemFileReadStore未正确加载。任何人都知道我在做什么错了?我一直在努力让自己的头发出现几天,所以任何帮助都非常感谢。

干杯, 杆。

回答

2

好的!问题已解决(对我而言):

如果您仔细查看了每个商店生成的商店,则两者的数据都存在,但商店代表的方式各不相同。

与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); 
}}); 

它为我(完沮丧的下午)...

0

你提到的错误: “dijit.tree.TreeStoreModel:查询{”名“:”测试父“}返回0的项目,但必须返回一个项目”

应该从使用TreeStoreModel而不是森林toreModel。前者只需要为根节点返回一个项目。你的修复可能工作,因为你把它推到一个单一的数组。

看一看: http://ofps.oreilly.com/titles/9780596516482/application_widgets.html

相关问题