我正在尝试使用 Dojo 工具包实现跨域延迟加载树。到目前为止,我的顶级节点显示正确,但是在单击 expando 时,我收到“延迟已解决”错误,我不知道为什么。通过查看 firebug 网络选项卡,我可以看到 fetch 方法似乎正在工作。我认为我的问题出在我的 _processResults 方法中,可能与其中的 _loadObject 定义有关...
鉴于我一直在努力理解 Dojo,我觉得我应该更好地了解它。但是,唉,它真是一头野兽……我在其中一个 sitepen 博客(http://www.sitepen.com/blog/2008/06/25/web-service )中看到了一些关于 JSONP 和延迟加载的提及-data-store/),但它没有提到为什么除了 JSONP 是 asyncronus 之外它不应该是可能的。如果 Dojo 只是将传入的 json 数据填充到存储中,我不明白为什么这很重要。
也许这与我的数据格式有关 - sitepen 上的另一个示例(http://www.sitepen.com/blog/2010/01/27/efficient-lazy-loading-of-a-tree/)使用jsonreststore 在展开节点之前不会加载项目,而我的格式会加载项目但在展开节点之前不会加载子节点...
事不宜迟,这里是ta codez...
<script type="text/javascript">
dojoConfig = {
parseOnLoad: true,
isDebug: true,
usePlainJson: true
};
</script>
<script type="text/javascript" src="scripts/dojo_16/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.parser");
dojo.require("dojo.io.script");
dojo.require("dojox.rpc.Service");
dojo.require("dojox.data.ServiceStore");
dojo.require("dijit.tree.ForestStoreModel");
dojo.require("dijit.Tree");
dojo.addOnLoad(function(){
var mySmd = {
"SMDVersion": "2.0",
"id": "http://urlbehindfirewall/testtree/",
"description": "This is the service to get to the finder app backend data",
transport: "JSONP",
envelope: "URL",
additionalParameters: true,
target: "http://urlbehindfirewall/testtree/",
services: {
"getChildrenNodes": {
"target": "getChildrenNodes.php",
parameters: [
{ name: "nodeId", type: "integer"}
]
}
}
};
var myService = new dojox.rpc.Service(mySmd);
var myStoreParams = {
service : myService.getChildrenNodes,
idAttribute : "Node_Id",
labelAttribute : "Display_Name",
_processResults: function(results, def){
var _thisStore = this;
for(i in results){
results[i]._loadObject = function(callback){
_thisStore.fetch({
query: { nodeId: this.Node_Id },
onItem: callback
});
delete this._loadObject;
};
}
return {totalCount: results.length, items: results};
}
};
var myStore = new dojox.data.ServiceStore(myStoreParams);
//create forestTreeModel
var treeModelParams = {
store: myStore,
deferItemLoadingUntilExpand: true,
childrenAttrs: ["Children_Nodes"],
rootId : 1,
query: 1
};
var treeModel = new dijit.tree.ForestStoreModel(treeModelParams);
var myTree = new dijit.Tree({
model: treeModel,
id: "myTree",
showRoot: false
});
dojo.byId("treeContainer").appendChild(myTree.domNode);
myTree.startup();
});
</script>
这是 json 数据结构的一个示例:不幸的是,该服务目前位于网络防火墙后面......我将努力建立一个公共版本来演示一下。同时,这是在根节点节点 1 上搜索的响应:
[
{
"Node_Id":"2",
"Display_Name":"LeftNode:2",
"Secondary_Names":"Parent:1",
"Obi_Id":"10002",
"Children_Nodes":[
],
"Has_Children":true,
"Child_Node_Ids":[
"5",
"6",
"7",
"8"
]
},
{
"Node_Id":"3",
"Display_Name":"Middle Node:3",
"Secondary_Names":"Parent:1",
"Obi_Id":"10003",
"Children_Nodes":[
],
"Has_Children":true,
"Child_Node_Ids":[
"9",
"10"
]
},
{
"Node_Id":"4",
"Display_Name":"Right Node:4",
"Secondary_Names":"Parent:1",
"Obi_Id":"10004",
"Children_Nodes":[
],
"Has_Children":true,
"Child_Node_Ids":[
"11",
"12"
]
}
]
然后扩展上述任何节点将获得该节点的子节点 - 因此 2 将获得节点数组 5,6,7,8 。(对于当前的实现,可能没有必要拥有 Child_Node_Ids 和 Children_Nodes,但不应该破坏任何东西吗?)
所以我敢肯定,到现在为止,眼睛都在发呆,重申这个问题 - 是什么造成了这个“延期已经解决”的错误?使用 JSONP 可以延迟加载树吗?不同的 json 结构会解决我的延迟加载问题吗?是否可以在 dojo 中重新格式化我的数据以使其正常工作?(我认为这就是 _processResults 方法的重点……)是否有任何可公开访问的树数据服务可供练习?
谢谢大家!