Почему мой dijit.Tree не заполнен из источника json? - PullRequest
0 голосов
/ 20 сентября 2010

Я новичок в додзё и весеннем развитии. Я пытаюсь заполнить виджет Tree, используя ответ json от контроллера spring-mvc. Я очень внимательно слежу за примерами с сайта dojocampus.

Во-первых, если я использую локальный источник данных, он работает нормально:

<script type="text/javascript">
    dojo.require("dojo.data.ItemFileReadStore");
    dojo.require("dijit.Tree");

    dojo.addOnLoad(function() {
        var rawdata = [{"rid":"b1c","name":"Test Parent","children":[{"rid":"1c4","name":"Test Child 1","children":[]},{"rid":"ee6","name":"Test Child 2","children":[]}]}];

        var store = new dojo.data.ItemFileReadStore({
            data: {
                identifier: 'rid',
                label: 'name',
                items: rawdata
            }
        });

        var treeModel = new dijit.tree.TreeStoreModel({
            store: store,
            query: {name: 'Test Parent'},
            childrenAttrs: ["children"]
        });

        new dijit.Tree({
            model: treeModel
        },
        "treeOne");
    });
</script>

<div id="treeOne">
</div>    

Но если я использую мой JSON-URL, дерево не появится:

<script type="text/javascript">
    dojo.require("dojo.data.ItemFileReadStore");
    dojo.require("dijit.Tree");

    dojo.addOnLoad(function() {

        var store = new dojo.data.ItemFileReadStore({
            url: "/Demo2/glossaryobjects/categories.json"
        });

        var treeModel = new dijit.tree.TreeStoreModel({
            store: store,
            query: {name: 'Test Parent'},
            childrenAttrs: ["children"]
        });

        new dijit.Tree({
            model: treeModel
        },
        "treeOne");
    });
</script>

<div id="treeOne">
</div> 

Когда я отлаживаю с Firebug, я вижу, что ответ json, кажется, загружен правильно. Это выглядит так:

{"identifier": "rid", "items": {"rid": "b1c", "name": "Test Parent", "children": [{"rid": "1c4", "name": "Test Child 1", "children": []}, {"rid": "ee6", "name": "Test Child 2", "children": []}]}, "label": "name"}

В Firebug есть ошибка:

"dijit.tree.TreeStoreModel: query {" name ":" Test Parent "} вернул 0 элементов, но должен вернуть ровно один элемент"

Похоже, что ItemFileReadStore загружен неправильно. Кто-нибудь знает, что я делаю не так? Я рвал на себе волосы несколько дней, пытаясь заставить это работать, поэтому любая помощь очень ценится.

Ура, Род.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

OK! Проблема решена (для меня):

Если вы внимательно посмотрите на магазин, созданный каждым из них, то данные есть для обоих, но способ, которым магазин представляет каждый, отличается.

С данными JSON URL вы получаете _arrayofallitems [] _arrayoftoplevelitems Object {.... Я бы... Предметы... и т.д.

со строковыми данными, вы получите _arrayofallitems [] 62 объекта _arrayoftoplevelitems [0] Я бы Предметы и т.д.

Если вы перехватите ответ JSON от xhrGet и сравните его со строкой, вы увидите, что ответ JSON не является массивом (нет []), тогда как строка является.

Решение: объявить пустой массив, вставить в него ответ JSON, затем передайте массив ItemFileReadStore:

dojo.xhrGet( {
       url: 'test.php',
       handleAs: "json",
       preventCache: 'true',
       load: function(response, ioArgs){
                  var rawdata = [];
                  rawdata.push(response);
                  var store = new dojo.data.ItemFileReadStore({ data: {
                     identifier: "id",
                     label: "label",
                 items: rawdata  }
             });
             loadtree(store);
}});

Это сработало для меня (закончил день разочарования) ...

0 голосов
/ 13 июля 2011

Ошибка, которую вы упомянули: "dijit.tree.TreeStoreModel: query {" name ":" Test Parent "} вернул 0 элементов, но должен вернуть ровно один элемент"

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

Взгляните на: http://ofps.oreilly.com/titles/9780596516482/application_widgets.html

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