Dojo树刷新

时间:2009-04-06 22:34:17

标签: dojo tree refresh

使用Dojo 1.3,在将一个子项(即文件夹或项目)添加到树后,有没有办法通过刷新或其他方法立即反映它?

3 个答案:

答案 0 :(得分:0)

来自官方Dojo manual

  

更新树

     

人们经常会问:

     

如何更新树(添加或   删除项目?)

     

你无法更新   树直接,但你需要   更新模型。通常模型是   连接到数据存储并在其中   您需要更新数据的情况   商店。因此,您需要使用数据   允许更新的商店(通过   这是官方的API),就像   dojo.data.ItemFileWriteStore。

     

如何从中刷新树   商店?

     

不支持此功能。商店   需要通知任何树   更改数据。目前这是   真的只支持(开箱即用)   通过dojo.data.ItemFileWriteStore,as   设置客户端 - 服务器dojo.data   服务器通知的源   客户端每当数据发生变化时   是非常复杂的,超越了   dojo的范围,仅限客户端   溶液

答案 1 :(得分:0)

假设,如果您的模型具有查询`{type:'continent'} - 意味着具有此属性的任何项都是顶级项,那么以下模型扩展将监视更改并刷新树的视图

var dataStore = new ItemFileWriteStore( { ... });
new Tree({
  store: dataStore,
  model: new ForestModel({
    onNewItem: function(item, parentInfo){
        if(this.store.getValue(item, 'type') == 'continent'){
            this._requeryTop();
        }
        this.inherited(arguments);
    }
  }
});

这应该反过来调用树中的childrenChanged并在每次添加新项目时更新它。

请参阅model reference

另外,如果添加的项目不是顶级项目,则应立即使用此语句进行更新。 parent是treenode,其项目已添加到children

tree._collapseNode(parent);
parent.state = 'UNCHECKED';
tree._expandNode(parent);

通过以下方式可以实现树的或多或少的“标准”刷新。它没有被添加到基础实现的原因,我认为是因为它将打破与树上的DnD功能的链接

dojo.declare("My.Tree", [dijit.Tree], {

           // Close the store? (So that the store will do a new fetch()).
         reloadStoreOnRefresh : true, 

         update: function() {
            this.model.store.clearOnClose = this.reloadStoreOnRefresh;
            this.model.store.close();

            // Completely delete every node from the dijit.Tree
            delete this._itemNodesMap;
            this._itemNodesMap = {};
            this.rootNode.state = "UNCHECKED";
            delete this.model.root.children;
            this.model.root.children = null;

            // Destroy the widget
            this.rootNode.destroyRecursive();

            // Recreate the model, (with the model again)
            this.model.constructor(this.model)

            // Rebuild the tree
            this.postMixInProperties();
            this._load();
         }
      }
);

答案 2 :(得分:0)

我已经解决了这个问题而无需刷新。

_refreshNodeMapping: function (newNodeData) {

    if(!this._itemNodesMap[newNodeData.identity]) return;

    var nodeMapToRefresh = this._itemNodesMap[newNodeData.identity][0].item;
    var domNode = this._itemNodesMap[newNodeData.identity][0].domNode;

    //For every updated value, reset the old ones
    for(var val in newNodeData)
    {
        nodeMapToRefresh[val] = newNodeData[val];

        if(val == 'label')
        {
            domNode.innerHTML = newNodeData[val];
        }
    }  
}