Dojo树刷新

Dojo树刷新,dojo,tree,refresh,Dojo,Tree,Refresh,使用Dojo 1.3,在将子项(即文件夹或项目)添加到树中后,是否有办法通过刷新或其他方法立即反映出来?来自官方 更新树 人们经常问: 如何更新树(添加或删除) 删除项目?) 您无法更新该文件 直接创建树,但您需要 更新模型。通常模型是 连接到数据存储并在其中 案例:您需要更新数据 商店。因此,您需要使用一个 允许更新的存储(通过 这是官方API),就像 dojo.data.ItemFileWriteStore 如何从中刷新树 商店 这是不受支持的。商店 需要通知树任何 对数据的更改。目前这是

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

来自官方

更新树

人们经常问:

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

您无法更新该文件 直接创建树,但您需要 更新模型。通常模型是 连接到数据存储并在其中 案例:您需要更新数据 商店。因此,您需要使用一个 允许更新的存储(通过 这是官方API),就像 dojo.data.ItemFileWriteStore

如何从中刷新树 商店

这是不受支持的。商店 需要通知树任何 对数据的更改。目前这是 真正只支持(开箱即用) 由dojo.data.ItemFileWriteStore创建,如下所示 设置客户端服务器dojo.data 服务器通知服务器的源 每当数据发生更改时,客户端 是相当复杂的,而且超出了 dojo的作用域,它只是一个客户端 解决方案

从官方

更新树

人们经常问:

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

您无法更新该文件 直接创建树,但您需要 更新模型。通常模型是 连接到数据存储并在其中 案例:您需要更新数据 商店。因此,您需要使用一个 允许更新的存储(通过 这是官方API),就像 dojo.data.ItemFileWriteStore

如何从中刷新树 商店

这是不受支持的。商店 需要通知树任何 对数据的更改。目前这是 真正只支持(开箱即用) 由dojo.data.ItemFileWriteStore创建,如下所示 设置客户端服务器dojo.data 服务器通知服务器的源 每当数据发生更改时,客户端 是相当复杂的,而且超出了 dojo的作用域,它只是一个客户端 解决方案


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

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
,并在每次添加新项时更新它

另外,如果添加的项不是顶级项,则应该可以使用此语句立即进行更新
parent
是一个树节点,该树节点的
子节点中添加了一个项

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();
         }
      }
);

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

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
,并在每次添加新项时更新它

另外,如果添加的项不是顶级项,则应该可以使用此语句立即进行更新
parent
是一个树节点,该树节点的
子节点中添加了一个项

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();
         }
      }
);

我不需要刷新就解决了这个问题

_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];
        }
    }  
}

我不需要刷新就解决了这个问题

_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];
        }
    }  
}

巴德霍西使用的是1.3。这可能与您使用的商店类型有关Badhorsie使用的是1.3。这可能与你使用的商店类型有关