Dojo ツールキットを使用して、クロスドメインの遅延読み込みツリーを実装しようとしています。これまでのところ、トップ レベルのノードは正しく表示されていますが、expando をクリックすると、「遅延は既に解決されています」というエラーが表示され、その理由がわかりません。firebug のネットワーク タブを見ると、fetch メソッドが機能しているように見えます。私の問題は _processResults メソッド内にあると思います。おそらく、その中の _loadObject の定義に関係しています...
Dojo を理解しようと多くの時間を費やしてきたので、Dojo についてもっとよく知る必要があると感じています。しかし、悲しいかな、それはかなりの野獣です... サイトペンのブログの 1 つで、JSONP と遅延読み込みが機能しないという言及を見たことがあります ( http://www.sitepen.com/blog/2008/06/25/web-service -data-store/ )、しかし、JSONP が非同期であること以外にそれが可能であってはならない理由については言及されていません。Dojo が入ってくる json データを単にストアに詰め込もうとしているのなら、なぜそれが重要なのか理解できません。
おそらく、それは私のデータのフォーマットに関係しています - サイトペンの別の例 ( http://www.sitepen.com/blog/2010/01/27/effective-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 メソッドのポイントだと思っていました...) 練習する公開されたツリー データサービスはありますか?
みんな、ありがとう!