【问题标题】:Cannot refresh TreeStore in EXTjs无法在 EXTjs 中刷新 TreeStore
【发布时间】:2013-04-29 23:28:01
【问题描述】:

我正在尝试在 EXTJ 中创建一个包含两个主要组件的网页:

  1. 一个表单(Ext.form.Panel)
  2. 面板(Ext.tree.Panel)

表单应该获取一些值,这些值应该填充到第二个面板中的树中。在第一个面板的按钮处理程序中,我可以访问更新的 JSON 对象,但我无法找到刷新 TreeStore 的方法,该方法将更新 tree.Panel 中的显示。

这是我目前所拥有的:

Ext.define('TreeServiceData',{
    config:{
    data : ''
    },print : function() {
    console.log("Printing data: ")
    console.log(this.data.children[0])
    }
});
var dataObject = Ext.create('TreeServiceData');
dataObject.setData({'expanded':false,'children':[{'text':'Master','expanded':true,'leaf':false,'children':[{'text':'Child 1','expanded':true,'leaf':false,'children':[{'text':'Child 2','expanded':true,'leaf':false,'children':[{'text':'Child 3','expanded':false,'leaf':false}]}]}]}]})


Ext.define('TreeStoreData',{
    extend: 'Ext.data.TreeStore',
    model: 'TaskModel',
    autoLoad: true,
    autoSync: true,
    proxy: {
        type:'memory',
        reader: {
            type:'json'
        }
    },
    root:dataObject.getData()
});

var treeStore = Ext.create('TreeStoreData');

现在我正在尝试在按钮调用上更新并显示此树存储的值,如下所示:

buttons:[
{
    text:'Get CCP/Product',
    handler:function (btn, evt) {
        dataObject.print();
        treeStore.removeAll();           
        dataObject.setData({'expanded':false,'children':[{'text':'Master11','expanded':true,'leaf':false,'children':[{'text':'Child 12','expanded':true,'leaf':false,'children':[{'text':'Child 23','expanded':true,'leaf':false,'children':[{'text':'Child 34','expanded':false,'leaf':false}]}]}]}]})
        dataObject.print();

    }
}
]

但在这个按钮处理程序上,我总是在 treeStore.removeAll() 方法上收到“Uncaught TypeError: Cannot call method 'indexOf' of undefined”,其中 treestore 在此上下文中明确定义。

问题 1) 刷新 TreeStore 的正确方法是什么?

【问题讨论】:

    标签: javascript extjs extjs4


    【解决方案1】:

    答案 1)

    代替:

    treeStore.removeAll();
    dataObject.setData( ... );
    

    你应该这样做:

    dataObject.setData( ... ); // This won't affect the store
    treeStore.setRootNode(dataObject.getData()); // Actually update the store
    

    请注意,更改 dataObject 的数据不会像您想象的那样自动影响存储...

    【讨论】:

      【解决方案2】:

      此代码适用于我 (ExtJS 4.2.1) 总树面板节点刷新示例:

          var responseDictObjects = $.ajax({
              data: { Id: this.idDictionary },
              dataType: "json",
              type: "POST",
              cache: false,
              url: 'http://' + config.domain + '/' + 'api/Dictionaries/GetDictTreeData',
              async: false
          }).responseText;
      
          responseDictObjects = jQuery.parseJSON(responseDictObjects);
      
      
          while (this.storeDict.getRootNode().firstChild) {
              this.storeDict.getRootNode().removeChild(this.storeDict.getRootNode().firstChild);
          }
          this.storeDict.getRootNode().appendChild(responseDictObjects.Data);
      

      将 this.storeDict 替换为您的商店参考。

      就我而言:

              JSON.stringify(responseDictObjects.Data)
      

      返回

      "[{"id":8,"text":"kkk","leaf":false,"expanded":true,"children":null},{"id":17,"text": “tttt”,“叶子”:假,“扩展”:真,“孩子”:null},{“id”:22,“文本”:“gggg”,“叶子”:假,“扩展”:真, "children":null},{"id":23,"text":"qqq","leaf":false,"expanded":true,"children":null},{"id":24,"text ":"fff","leaf":false,"expanded":true,"children":null},{"id":27,"text":"fff","leaf":false,"expanded": true,"children":null},{"id":28,"text":"gggggggggggggggggggg","leaf":false,"expanded":true,"children":null},{"id":31, “文本”:“ttttttttttt666666666”,“叶子”:false,“扩展”:true,“儿童”:null},{“id”:32,“文本”:“ffffffffffffffffff”,“叶子”:false,“扩展":true,"children":null},{"id":33,"text":"kkkkkkkkkkkkkk","leaf":false,"expanded":true,"children":null},{"id": 35,"text":"7777777777","leaf":false,"expanded":true,"children":null},{"id":36,"text":"999999999999","leaf":false, "expanded":true,"children":null},{"id":37,"text":"iii","leaf":false,"expanded":true,"children":null}]"


      我发现 TreePanel 的另一个错误,执行 appendChild 后出现先前删除的节点。所以我开始使用 jquery 树插件(dynatree)。您只需要创建空面板。在渲染面板后,嵌入树,在我的例子中:

      创建空面板:

          that.treePanel = Ext.create('Ext.panel.Panel', {
              title: 'Records',
              width: 350,
              height: 400
          });
      

      渲染面板后,您可以随时刷新节点:

          var that = this;
      
          var responseDictObjects = $.ajax({
              data: { Id: this.idDictionary },
              dataType: "json",
              type: "POST",
              cache: false,
              url: 'http://' + config.domain + '/' + 'api/Dictionaries/GetDictTreeData',
              async: false
          }).responseText;
      
          responseDictObjects = jQuery.parseJSON(responseDictObjects);
      
          var el = this.treePanel.getId();
      
          if (this.treeDict == null) {
              this.treeDict = $('#' + el).dynatree({
                  onActivate: function (node) {
                      that.treeDict.lastSelectedId = node.data.index;
                  },
                  children: []
              });
          }
          this.treeDict.dynatree("getRoot").removeChildren(true);
          this.treeDict.dynatree("getRoot").addChild(responseDictObjects.Data);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多