【问题标题】:dijit/Tree is not updated when connected to a dojo/store/JsonRest连接到 dojo/store/JsonRest 时 dijit/Tree 未更新
【发布时间】:2015-06-02 09:56:28
【问题描述】:

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

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

我比较了 dojo/store/Memory(来自原始教程)和 dojo/store/JsonRest 在“put”请求之后返回的内容: 内存返回新对象的 id。 JsonRest 以“return xhr(...)”结尾,所以它返回一个 Deferred 而不是新的 id,这似乎不被 Observable 理解。如果我将 dojo/store/JsonRest.js 更改为以以下结尾,我可以让它工作:

  ...
  return xhr(...).then(function(data){
    return data.id;
  };
}

希望有不修改dojo源的解决方案?!

更多细节如下:

这是我的 store 的定义,而不是原来的 Memory store:

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 源。

谢谢

多米尼克

【问题讨论】:

    标签: dynamic dojo notify dijit.tree jsonreststore


    【解决方案1】:

    尝试使用 Observable wrapper 包装您的 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 中的通知并将该信息传递给树。

    【讨论】:

    • JsonRest 被一个 Observable 包裹着,如果你检查上面链接的演示的源代码的话。唯一的区别是我将演示中的“governmentStore=new Memory(...)”替换为“governmenStore=new JsonRest(...);governmentStore=new Cache(governmentStore,...);”。我将如何测试模型是否正常运行?所有检查都表明 JsonRest 存储返回的数据与原始演示相同。
    • 正如我所写,不同之处在于对 JsonRest 的“PUT”请求会返回 Deferred,而对 Memory 的“PUT”请求会返回新项目的 id。显然这是一个错误,或者至少是 dojo 数据存储之间的不兼容。
    • 是的,你说得对,Observable 和 JsonRest 不能很好地结合在一起。我忘记了 JsonRest 没有查询引擎(因为预计服务器会处理一些正常的查询引擎方面)。我认为您需要在这里做的是在内存周围放置一个 Observable,因为那是正在更新的实际存储。我已经更新了我的答案,以显示我认为应该有效的方法。
    • 如果我遵循您的建议,我会收到“错误:dijit.tree.ObjectStoreModel:根查询返回 0 个项目,但必须准确返回一个”。没有任何请求发送到服务器,这是意料之中的,因为树在一个空的内存存储上运行。除非有人有解决方案,否则我将提交错误报告并使用修改后的 dojo 源(请参阅我的原始答案)作为解决方法,尽管这会很麻烦。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多