dojo.itemFileReadStore在嵌套数组上失败

时间:2011-11-19 22:19:22

标签: javascript dojo

我遇到的问题是,对象内部关联的嵌套数组会导致获取声明失败。实际的JSON本身是有效的,当数组本身被注释时,它工作正常。我想解析整个对象,最终访问数组。

这是对象(恶意数组在“第2页”项目中):

{
    "identifier":"pageTitle",
    "label":"pageTitle",
    "items":[
        {
            "pageTitle":"Page 1",
            "pageUrl":"#"
        },
        {
            "pageTitle":"Page 2",
            "subTopics":[
                {
                    "subTitle":"Subpage 1"
                }
            ],
            "pageUrl":"index.html"
        },
        {
            "pageTitle":"Page 3",
            "pageUrl":"#"
        }
    ]
}

和获取代码(相当简单)

try {
    var JSONObject = new dojo.data.ItemFileReadStore({url: "object.json"});

    //Fetch nav objects and start building
    JSONObject.fetch({
        query: {"pageTitle":"*"},
        onBegin: clearNav,
        onComplete: buildNav,
        onError: failureNav
    });

} catch(xcept) {
    console.warn("Failed to create JSONObject", xcept);
}

及相关功能

function clearNav(items, req) {
    console.log("clearNav()");
    dojo.query("nav.navigation ul").forEach(function(items, idx) {
        items.innerHTML="";
    });
    console.warn("Navigation destroyed...");
}

function buildNav(items, req) {
    console.log("buildNav()");

    console.debug("items", items);

    var theList = dojo.query("nav.navigation ul")[0];

    dojo.forEach(items, function(item, idx) {
        var newLI = document.createElement("li");

        console.warn("url", document.URL);
        if (document.URL.search(item.pageUrl)) {
            newLI.setAttribute("class","ac");
        }

        newLI.innerHTML = "<a href=\""+item.pageUrl+"\" >"+item.pageTitle+"</a>";
        theList.appendChild(newLI);
    });
}

function failureNav(e) {
    console.debug("Error", e);
}

1 个答案:

答案 0 :(得分:3)

您有两种选择:

  • 格式化您的JSON嵌套对象(“subTopicts”)以符合具有相同标识符的主要对象;

    {
      "identifier":"pageTitle",
      "label":"pageTitle",
             "items":[
                 {
                 "pageTitle":"Page 1",
                 "pageUrl":"#"
             },
             {
                 "pageTitle":"Page 2",
                 "subTopics":[
                     {
                         "pageTitle":"Page 1.1",
                         "subTitle":"Subpage 1"
                     }
                 ],
                 "pageUrl":"index.html"
             },
             {
                 "pageTitle":"Page 3",
                 "pageUrl":"#"
             }
         ]
     }
    
  • 或者让Dojo忽略该嵌套对象,使用参数herarchical创建ItemFileReadStore:“false”

    var JSONObject = new dojo.data.ItemFileReadStore({
      url: "object.json",
      hierarchical: false
    });
    

您可以在doc中找到此文档。