Dynamic 当连接到dojo/store/JsonRest时,dijit/Tree不会更新

Dynamic 当连接到dojo/store/JsonRest时,dijit/Tree不会更新,dynamic,dojo,notify,dijit.tree,jsonreststore,Dynamic,Dojo,Notify,Dijit.tree,Jsonreststore,我已经在上修改了dojo教程,以从JsonRest存储中读取 问题是,当我单击根元素上的“将新子项添加到选定项”时,树显示不会更新,尽管更新在原始教程中起作用 我比较了dojo/store/Memory(来自原始教程)和dojo/store/JsonRest在“put”请求后返回的内容: 内存返回新对象的id。 JsonRest以“returnxhr(…)”结尾,因此它返回一个延迟的id,而不是新的id,这似乎是被观察者无法理解的。如果我将dojo/store/JsonRest.js更改为以以下

我已经在上修改了dojo教程,以从JsonRest存储中读取

问题是,当我单击根元素上的“将新子项添加到选定项”时,树显示不会更新,尽管更新在原始教程中起作用

我比较了dojo/store/Memory(来自原始教程)和dojo/store/JsonRest在“put”请求后返回的内容: 内存返回新对象的id。 JsonRest以“returnxhr(…)”结尾,因此它返回一个延迟的id,而不是新的id,这似乎是被观察者无法理解的。如果我将dojo/store/JsonRest.js更改为以以下内容结束,我可以让它工作:

  ...
  return xhr(...).then(function(data){
    return data.id;
  };
}
我希望有一个不修改dojo源代码的解决方案

更多详情如下:

这是“我的存储”而不是原始内存存储的定义:

var governmentStore = new JsonRest({
  target : "http://localhost:8080/test/gov",
  getChildren : function(object) {
    return this.query({
      parent : object.id
    });
  }
 });
 var governmentStore = new Cache(governmentStore,new Memory({}));
(如果我删除缓存并直接使用JsonRest,即使修改后的JsonRest.js也不会更新树)

这是PUT请求对json服务器的回复:

{"name":"New Child", "id":0.7243958345}
请帮助允许dijit/树对底层JsonRest存储的更改作出反应,而不必与dojo源代码混淆

多谢各位


Dominic

试着用一个包装你的JsonRest存储,看看这是否有助于正确更新树。还要确保树的模型正常工作,因为这是通过侦听存储来处理树何时何地更新的内容

var memStore = new Memory({});
var store = new Observable(memStore); //Use this store for your tree
var cacheStore = new Cache(governmentStore,memStore);

这里的想法是,当您执行PUT时,应该将其放入cacheStore,而不是governmentStore。缓存将在governmentStore上执行PUT,但也会在PUT完成时更新memStore,这将触发Observable中的notify,并将该信息传递给树。

解决方案是使用jquery而不是dojo。我发现我可以在学习jquery的几个小时内解决使用dojo时出现的所有问题。这主要是因为这两个库的文档质量很高,而且dojo似乎有太多的bug,无法对新的bug报告做出反应。

如果您查看上面链接的演示的源代码,JsonRest会被一个可观察的文件包住。唯一的区别是,我将演示中的“governmentStore=newmemory(…)”替换为“governmentStore=newjsonrest(…);governmentStore=newcache(governmentStore,…);”。如何测试模型是否正常工作?所有检查都显示JsonRest存储返回与原始演示相同的数据。正如我所写的,区别在于对JsonRest的“PUT”请求返回延迟的数据,而对内存的“PUT”请求返回新项的id。显然,这是一个bug,或者至少是dojo数据存储之间的不兼容。是的,您在Observable和JsonRest方面做得不好是对的。我忘记了JsonRest没有查询引擎(因为服务器需要处理一些正常的查询引擎方面)。我认为你需要做的是在内存周围放置一个可观察的对象,因为这是正在更新的实际存储。我已经更新了我的答案,以显示我认为应该如何工作。如果我按照你的建议,我会得到“错误:dijit.tree.ObjectStoreModel:root查询返回0个项,但必须只返回一个”。没有向服务器发送任何请求,这是意料之中的,因为树在空内存存储上运行。除非有人有一个解决方案,否则我将提交一个bug报告,并使用修改过的dojo源代码(参见我的原始答案)作为解决方法,尽管这会让人感到很痛苦。