dojo: загрузка данных json из локального файла (с использованием http) в дерево dijit
Файл snapshot_report_js.js:
require([
"dojo/dom",
"dojo/json",
"dojo/store/Memory",
"dijit/tree/ObjectStoreModel",
"dijit/Tree",
"dojo/text!http://localhost:8080/dojo/json_data/snapshot.json",
"dojo/domReady!",
"dojo/_base/json"
], function(dom, json, Memory, ObjectStoreModel, Tree, small){
var stringfied_content = JSON.stringify(small)
var json_parsed_data = JSON.parse(stringfied_content, true)
var json_data = dojo.toJson(json_parsed_data);
// set up the store to get the tree data
var json_store = new Memory({
data: [ json_data ],
getChildren: function(object){
return object.children || [];
}
});
// Create the model
var snapshot_treeModel = new ObjectStoreModel({
store: json_store,
query: {id: 'snapshot'}
});
var snapshot_tree = new dijit.Tree({
model: snapshot_treeModel
}, 'div_snapshot_tree');
snapshot_tree.startup();
})
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Snapshot</title>
<link rel="stylesheet" href="dijit/themes/claro/claro.css">
<!-- load Dojo -->
<script src="dojo/dojo.js" data-dojo-config="async: true"></script>
<script src="js/snapshot_report_js.js"></script>
</head>
<body class="claro">
<div id="div_snapshot_tree"></div>
</body>
</html>
JSON-файл:
{
"snapshot_metadata": {
"report_end_at": "2017-10-11 02:03:36",
"environment_name": "DVINST",
"report_start_at": "2017-10-11 01:55:42"
},
"versions": [
{
"id": "version_001",
"instances": [
{
"instance_name": "instance1",
"instance_create_date": "2017-09-18 00:17:52",
"connected_site_count": 4,
"admin_server": "t3://tserver:18300",
"instance_id": 2411,
"instance_type": "OSVC",
"instance_created_by": "None",
"site_capacity": 2,
"sites": [
{
"site_db_id": 395,
"site_name": "zzzz_178",
"site_users": "uc1,uc2,uc3",
"site_id": 89492,
"site_owner": "owner1",
"site_db_name": "site_server2"
},
{
"site_db_id": 395,
"site_name": "site2",
"site_users": "u1, u2, u3",
"site_id": 90447,
"site_owner": "u2",
"site_db_name": "site_server3"
}
]
}
]
}
],
"servers": [
{
"status": null,
"server_id": 13,
"server_name": "db1",
"server_type": "database",
"mount_points": [],
"sites": [],
"db_connections_count": 6,
"health": null,
"admin_servers": null,
"db_sites_connected_count": null
}
]
}
Ошибка на консоли:
dojo.js: 8 Uncaught Ошибка: dijit.tree.ObjectStoreModel: корневой запрос вернул 0 элементов, но должен возвращать ровно один в объекте.
(ObjectStoreModel.js.uncompressed.js: 86) в dojo.js: 8 в когда
(dojo.js: 8) в Object.getRoot
(ObjectStoreModel.js.uncompressed.js: 82) в Object._load
(Tree.js.uncompressed.js: 897) в Object.postCreate
(Tree.js.uncompressed.js: 844) в Object.create
(_WidgetBase.js.uncompressed.js: 453) в Object.postscript
(_WidgetBase.js.uncompressed.js: 366) в новом (dojo.js: 8)
at snapshot_report_js.js: 178
Я не вижу здесь ничего плохого, кто-нибудь может помочь?
1 ответ
На первый взгляд ваш ObjectStoreModel
пытается найти корневой объект для дерева и, как вы указали, он должен иметь свойство id
равно snapshot
; ничто в вашем JSON не соответствует этому запросу.
Во-вторых, данные JSON должны приносить древовидную структуру, в то время как ваш JSON неструктурирован; см. пример ObjectStoreModel, как выглядят данные дерева. Если у вас есть пользовательская структура данных, вам нужно преобразовать ее, чтобы она использовалась виджетом дерева через его модель.