我有JsonRest
与dijix.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
函数只在第一次展开时被调用一次。
我想要实现的是禁用缓存,即。 每次展开节点时发送请求。
答案 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。
我发现tree.getNodesByItem(item)
对第一部分有所作为。唯一要记住的是它返回一个节点数组,所以我们需要取第一个元素:
tree.getNodesByItem(item)[0]
现在只需设置属性:
tree.getNodesByItem(item)[0]._loadDeferred = false;
所以,最终解决方案是
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;
}
}));