使用选项卡中呈现的通用网格存储数据问题

时间:2014-12-29 13:40:32

标签: extjs

我有一个通用的网格组件。 点击菜单项对应的网格显示在独立的选项卡中。 在渲染网格组件时,动态设置存储数据并填充网格。 如果我在两个选项卡中打开两个网格,导航到第一个选项卡时,网格数据不会显示,因为存储数据被设置为第二个网格数据。

希望找到解决方案。谢谢

主控制器中的代码:

OnMenuItemClick: function(c){
        var nodeText = c.text,
        tabs = Ext.getCmp('app-tab'),
        tabBar = tabs.getTabBar(),
        tabIndex;
        for(var i = 0; i < tabBar.items.length; i++) {
            if (tabBar.items.get(i).getText() === nodeText) {
            tabIndex = i;
            }
        }    
        if (Ext.isEmpty(tabIndex)) {          
          /* Note: While creating the Grid Panel,here we are passing the Menu/Grid Id along with it for future reference */
          tabs.add(Ext.create('DemoApp.view.grid.GenericGrid',{title:nodeText,gridId:c.id,overflowY: 'scroll',closable:true}));
          tabIndex = tabBar.items.length - 1 ;
       }
        tabs.setActiveTab(tabIndex);         
    }
通用网格控制器中的

代码:

renderGridMetadata: function(genericGrid) {
          var store = Ext.getStore("DemoApp.store.GenericGrid"),
              gridId = genericGrid.up().gridId,
              resourceURL = "resources/data/" + gridId + ".json";
          var serviceInput = Util.createServiceResponse(gridId);
          /*Dynamically add the proxy URL to the ViewModel
         DemoApp.model.GenericGrid.getProxy().setUrl(resourceURL);*/
          Ext.getBody().mask("Loading... Please wait...", 'loading');
          Ext.Ajax.request({
              url: Util.localGridService,
              method: 'POST',
              headers: {
                  "Content-Type": "application/json",
                  'SM_USER': 'arun.x.kumar.ap@nielsen.com',
                  'SM_SERVERSESSIONID': 'asdfadsf'
              },
              jsonData: {
                  getConfigurationAndDataRequestType: serviceInput
              },
              success: function(conn, response, options, eOpts) {
                  Ext.getBody().unmask();
                  var data = Util.decodeJSON(conn.responseText);
                  /* Apply REST WebServices response Metadata to the Grid */
                  var recordsMetaData = data.getConfigurationAndDataReplyType.gridConfigDataResponse.data.record;
                  var jsonMetaDataArray = [];
                  for (var c = 0; c < recordsMetaData.length; c++) {
                      var jsonMetaDataObject = {};
                      var text = data.getConfigurationAndDataReplyType.gridConfigDataResponse.data.record[c].displayName;
                      var dataIndex = data.getConfigurationAndDataReplyType.gridConfigDataResponse.data.record[c].columnName;
                      jsonMetaDataObject["text"] = text;
                      jsonMetaDataObject["dataIndex"] = dataIndex;
                      jsonMetaDataArray.push(jsonMetaDataObject);
                  }
                  /* Apply REST WebServices response data to the Grid */
                  var recordsData = data.getConfigurationAndDataReplyType.gridDataResponse.record;
                  var jsonDataArray = [];
                  for (var r = 0; r < recordsData.length; r++) {
                      var columnsData = data.getConfigurationAndDataReplyType.gridDataResponse.record[r].column;
                      var jsonDataObject = {};
                      for (var c = 0; c < columnsData.length; c++) {
                          jsonDataObject[columnsData[c].columnId] = columnsData[c].columnValue;
                      }
                      jsonDataArray.push(jsonDataObject);
                  }
                  store.setData(jsonDataArray);
                  genericGrid.reconfigure(store, jsonMetaDataArray);
              },
              failure: function(conn, response, options, eOpts) {
                  Ext.getBody().unmask();
                  Util.showErrorMsg(conn.responseText);
              }
          });
          store.load();
      }
  });

1 个答案:

答案 0 :(得分:0)

很可能只有一个DemoApp.store.GenericGrid实例。

坦率地说,我只是猜测,因为我看到你调用Ext.getStore("DemoApp.store.GenericGrid")意味着商店可能在应用程序类中的stores:["DemoApp.store.GenericGrid"]数组中声明。

如果以这种方式声明商店,那么Ext会自动创建一个实例,将storeId设置为stores:[]中列出的字符串。因此,Ext.getStore()返回该实例。

如果你想拥有两个独立的网格实例,你必须自己创建商店实例,最好是initComponent覆盖。