Использование Dijit.Tree с QueryReadStore для отложенной загрузки - PullRequest
1 голос
/ 18 июня 2011

Я пытаюсь использовать 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", похоже, не помогает.

1 Ответ

1 голос
/ 18 июня 2011

РЕДАКТИРОВАТЬ : Забудьте о references. У вас все еще есть проблема, описанная с атрибутом children, но, глядя на исходный код QueryReadStore и TreeStoreModel, я не понимаю, как он вообще может работать, по крайней мере, в версии 1.6. Также см. http://bugs.dojotoolkit.org/ticket/5876. Там говорится, что вам не нужны ссылки, и вы можете напрямую передавать значения идентификаторов. Но опять же, я не уверен, что это сработает. Вам может потребоваться создать подкласс и переопределить некоторые методы из QueryReadStore.


Ваш серверный скрипт возвращает недопустимое значение для атрибута children. Он возвращает true, когда должен возвращать список ссылок на другие элементы или сами элементы. Поскольку в вашем случае вы хотите отложить загрузку дочерних элементов до раскрытия, атрибут children должен иметь ссылки. См. эту страницу в справочном руководстве по Dojo.

Что-то вроде:

{
  "label":"name",
  "identification":"id",
  "items":[
    {
      "id":3,
      "name":"Autobiographical"
    },
    {
      "id":1,
      "name":"Blogging",
      "children": [
        {_reference:100}, {_reference:101}
      ]
    },
    ...
  ]
}

Где идентификаторы 100 и 101 не обязательно возвращаются в первом пакете данных, но могут быть получены позже, выполняя новые запросы к вашему серверу.

Кроме того, запрос в ForestTreeModel должен быть чем-то, что возвращает ваши root элементы. {id:0} это не такое условие. Вы можете добавить фиктивный атрибут root ко всем возвращенным элементам и установить его в true для своих корней. Хотя {id:0}, кажется, работает сейчас, он может укусить вас позже, когда дереву потребуется запросить корневые элементы, а хранилище использует уже загруженные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...