将Dijit.Tree与QueryReadStore一起使用以进行延迟加载

|| 我正在尝试将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   [解决此错误](function(){var _1 = null; if((_ 1 ||(typeo ... setTimeout(dojo._loadInit,100);}})(); 关于什么可能有什么建议?您可以在此处查看实时测试页面: http://asisaid.com/safari-resources/lazyLoad.html 更新的意见2011年6月19日: 我注意到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 \”似乎可以解决问题)。     
已邀请:
        编辑:忘了the4ѭ。您仍然具有使用
children
属性描述的问题,但是从查看
QueryReadStore
TreeStoreModel
的源代码后,我看不到它如何工作,至少在1.6版中。另外,请参见http://bugs.dojotoolkit.org/ticket/5876。它说那里不需要引用,您可以直接传递id值。但是,我不确定它是否能正常工作。您可能需要继承
QueryReadStore
中的某些方法。 您的服务器脚本返回的
children
属性值无效。当它应该返回对其他项目或项目本身的引用列表时,返回10。由于在您的情况下,您希望将加载子项的时间推迟到扩展之前,因此
children
属性应该具有引用。请参阅《 Dojo参考指南》中的此页面。 就像是:
{
  \"label\":\"name\",
  \"identification\":\"id\",
  \"items\":[
    {
      \"id\":3,
      \"name\":\"Autobiographical\"
    },
    {
      \"id\":1,
      \"name\":\"Blogging\",
      \"children\": [
        {_reference:100}, {_reference:101}
      ]
    },
    ...
  ]
}
其中id
100
101
不一定在第一批数据中返回,但是可以通过对服务器执行新查询而在以后获取。 另外,“ 15”中的查询应该是返回根项的内容。
{id:0}
不是这样的条件。您可以向所有返回的项目添加虚拟属性“ 17”,并将其根设置为“ 10”。尽管ѭ16现在似乎可以工作,但是稍后当树需要重新查询根项目并且商店使用已加载的数据时,它可能会咬你。     

要回复问题请先登录注册