0

我已经修改了http://dojotoolkit.org/documentation/tutorials/1.10/store_driven_tree/demo/demo.html上的 dojo 教程,以从 JsonRest 存储中读取。

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

我比较了 dojo/store/Memory(来自原始教程)和 dojo/store/JsonRest 在“put”请求后返回的内容:Memory 返回新对象的 id。JsonRest 以“return xhr(...)”结尾,所以它返回一个 Deferred 而不是新的 id,这似乎不被 Observable 理解。如果我将 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 也不会使 Tree 更新)。

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

{"name":"New Child", "id":0.7243958345}

请帮助允许 dijit/Tree 对底层 JsonRest 存储的更改做出反应,而不会弄乱 dojo 源。

谢谢

多米尼克

4

2 回答 2

0

尝试使用Observable 包装器包装您的 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。Cache 将在 GovernmentStore 上执行 PUT,但也会在 PUT 完成时更新 memStore,然后触发 Observable 中的通知并将该信息传递给树。

于 2015-06-03T01:30:31.747 回答
0

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

于 2015-06-04T07:50:24.887 回答