dojo.itemFileReadStore在嵌套数组上失败

dojo.itemFileReadStore fails on nested array

本文关键字:失败 数组 嵌套 itemFileReadStore dojo      更新时间:2023-09-26

我遇到了一个问题,其中一个嵌套数组关联在一个对象内导致fetch声明失败。实际的JSON本身是有效的,当数组本身被注释时,它工作得很好。我想解析整个对象,并最终访问数组。

对象是这样的(这个邪恶的数组在"Page 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);
}

你有两个选择:

  • 格式化JSON嵌套对象("subtopics")以符合与主对象具有相同的标识符名称;

    {
      "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忽略嵌套对象,创建参数为hierarchy: "false"的ItemFileReadStore

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

您可以在文档中找到这个文档