如何在Dojo树中的每个节点上禁用缓存/触摸服务器?

时间:2013-12-24 12:55:54

标签: javascript dojo tree

我有JsonRestdijix.Tree相关联。节点是延迟加载的。这就是我的树的样子:

var store = new Observable(new JsonRest({
    target: "...",
    idProperty: "id",
    mayHaveChildren: function(object) {
        return object.hasChildren;
    },
    getChildren: function(object, onComplete, onError) {
        this.get(object.id).then(function(fullObject) {
            object.children = fullObject.children;
            onComplete(fullObject.children);
        }, onError);
    },
    getRoot: function(onItem, onError) {
        this.get("I1").then(onItem, onError);
    },
    getLabel: function(object) {
        return object.name;
    }
}));

第一次展开树节点时,请求被发送到服务器以获取节点的子节点。

但是,此调用是缓存,因此下次展开节点时,不会发送任何请求。我还注意到getChildren函数只在第一次展开时被调用一次。

我想要实现的是禁用缓存,即。 每次展开节点时发送请求

1 个答案:

答案 0 :(得分:1)

事实上,这是可能的。分析Dojo的Tree.js代码,得出结论,每个节点上调用的函数都是

_expandNode: function(/*TreeNode*/ node)

该函数包含以下代码:

// Load data if it's not already loaded
if(!node._loadDeferred){
    // load the node
}

当然,我们的罪魁祸首是_loadDeferred财产。所以问题是,如何为每个展开的节点设置此属性。

我决定用getChildren方法做到这一点。首先,我需要根据商店中的项目获取树节点,然后我必须将其属性设置为false。

  1. 我发现tree.getNodesByItem(item)对第一部分有所作为。唯一要记住的是它返回一个节点数组,所以我们需要取第一个元素:

    tree.getNodesByItem(item)[0]
    
  2. 现在只需设置属性:

    tree.getNodesByItem(item)[0]._loadDeferred = false;
    
  3. 所以,最终解决方案

    var store = new Observable(new JsonRest({
        target: "...",
        idProperty: "id",
        mayHaveChildren: function(object) {
            return object.hasChildren;
        },
        getChildren: function(object, onComplete, onError) {
            this.get(object.id).then(function(fullObject) {
                object.children = fullObject.children;
                onComplete(fullObject.children);
                tree.getNodesByItem(object)[0]._loadDeferred = false;
            }, onError);
        },
        getRoot: function(onItem, onError) {
            this.get("I1").then(onItem, onError);
        },
        getLabel: function(object) {
            return object.name;
        }
    }));