【问题标题】:Dojo Tree Refresh道场树刷新
【发布时间】:2009-04-06 22:34:16
【问题描述】:

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

【问题讨论】:

    标签: dojo tree refresh


    【解决方案1】:

    来自官方Dojo manual

    更新树

    人们经常问:

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

    您无法更新 直接树,而是你需要 更新模型。通常模型是 连接到数据存储并在其中 如果您需要更新数据 店铺。因此,您需要使用数据 允许更新的商店(通过 它是官方 API),比如 dojo.data.ItemFileWriteStore.

    如何从 商店?

    这不受支持。店铺 需要通知任何树 数据的变化。目前这是 真的只支持(开箱即用) 通过 dojo.data.ItemFileWriteStore,作为 设置客户端-服务器 dojo.data 服务器通知的来源 数据发生变化时的客户端 相当复杂,超出了 dojo 的范围,仅限客户端 解决方案。

    【讨论】:

      【解决方案2】:

      假设,如果您的模型有查询 `{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 是在其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();
               }
            }
      );
      

      【讨论】:

      • badhorsie 使用的是 1.3。这可能与您使用哪种类型的商店有关
      【解决方案3】:

      我已经解决了这个问题,不需要刷新。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多