Я пытаюсь использовать dojox.data.QueryReadStore в качестве хранилища для отложенной загрузки dijit.tree. Кажется, мне трудно найти примеры людей, использующих это хранилище вместо JsonRestStore, но я действительно хотел бы придерживаться использования строк запроса, а не синтаксиса REST для согласованности во всем приложении. Проблема в том, что, хотя я могу заставить QueryReadStore передавать по корневому уровню дерева, лениво загружая дочерние элементы, он всегда терпит неудачу.
Вот что у меня есть:
dojo.require("dojox.data.QueryReadStore");
dojo.require("dijit.Tree");
dojo.addOnLoad(function() {
var store = new dojox.data.QueryReadStore({
url:'/cgi-bin/safari/safari_json_responder.pl',
requestMethod: "get"
});
var treeModel = new dijit.tree.ForestStoreModel({
store: store,
deferItemLoadingUntilExpand: true,
query: { 'id' : "0" },
childrenAttrs: ["children"]
});
var myTree = new dijit.Tree({
model: treeModel
},
"treeOne");
myTree.startup();
});
Когда я нажимаю, чтобы развернуть одну из категорий, имеющих детей, я получаю эту ошибку от Firebug:
Узел не может быть вставлен в указанную точку в иерархии «код:» 3
[Break On This Error] (function () {var _1 = null; if ((_ 1 || (typeo ... setTimeout (dojo._loadInit, 100);}}) ();
Любые предложения по поводу того, в чем может быть проблема? Вы можете увидеть тестовую страницу здесь:
http://asisaid.com/safari-resources/lazyLoad.html
Обновленные наблюдения 19 июня 2011 г .:
Я заметил, что isItemLoaded в QueryReadStore утверждает, что он неполон. Возможно, документация Dojo о том, что QueryReadStore может обрабатывать отложенную загрузку, неверна? Я пытался заменить метод QueryReadStore.isItemLoaded, но не смог выяснить, что он должен делать. Я попытался найти атрибут «$ ref» или «_reference», но это не помогло.
Понятно, я делаю что-то не так. Хотя почему-то я чувствую, что я на правильном пути. Если бы я мог уведомить модель о том, что элемент не полностью загружен, возможно, что вещи вступят в действие так, как должны (и поступят с JsonRestStore).
Вот как выглядят выводимые данные, когда id = 0 передается на сервер:
{"label":"name","identification":"id","items":[{"name":"Autobiographical","poid":"0","id":"3"},{"name":"Blogging","poid":"0","children":[{"name":"asisaid","id":"2","$ref":"2"},{"name":"blogware","id":"4","$ref":"4"}],"id":"1","$ref":"1"}, [...]
(обрезано, чтобы оно не было слишком длинным.)
Я кидал ссылки и данные тут и там, пробуя разные вещи (я уверен, что у меня их слишком много в этом примере, но я пытался все бросить и посмотреть, что прилипает).
Изначально это выглядело так: id = 0:
{"label":"name","identification":"id","items":[{"name":"Autobiographical","poid":"0","id":"3"},{"name":"Blogging","poid":"0","children": "true","id":"1","$ref":"1"}, [...]
Я тоже пробовал это:
{"label":"name","identification":"id","items":[{"name":"Autobiographical","poid":"0","id":"3"},{"name":"Blogging","poid":"0","children": [{"$ref":"2" },{"$ref":"4"}],"id":"1"}, [...]
Ни одна из этих идей (ни одно и то же, но использование "_reference" вместо "$ ref", похоже, не помогает.