为什么加载数据存储时会出现Uncaught异常?

时间:2011-07-22 15:45:42

标签: ajax extjs4

我有一个由GridPanel(ExtJS 4)支持的DataStore。好的,所以当用户选择一行并单击删除按钮时,我向服务器发送POST请求,其中包含所选记录的ID,删除记录,然后在返回时重新加载数据存储

记录成功删除,服务器返回状态代码OK。但是,如果用户选择GridPanel最后一行,我会收到以下错误:

  

未捕获的TypeError:无法读取未定义的属性“id”

我在Grid PanelDataStore上没有其他活动。

这是我的删除代码:

function deleteTEDetailExceptions() {
   try {

      if(tedetailExceptionsEditorGrid.getSelectionModel().selected.length < 1) {
         statusMessage("Please select an exception first", true);
         return;
      }

      var record = tedetailExceptionsEditorGrid.getSelectionModel().selected.items[0];
      currentTEDetailExceptionKey = record.data["tedetailExceptionKey"];

      // send the delete request
      Ext.Ajax.request({
         url: '/timesheets/action.do',
         method: 'POST',
         params:{
            tedetailExceptionKey : currentTEDetailExceptionKey,
            type                 : "tedetailExceptions",
            "delete"             : "true"
         },
         success: function(response) {
            if(response.statusText == "OK") {
               tedetailExceptionsEditorGrid.getSelectionModel().clearSelections();
               TEDetailExceptionsStore.remove(record);

               // reload the store
               Ext.Function.defer((function(){

                  TEDetailExceptionsStore.load({
                     params:{
                        timeEntryDetailKey : timeEntryDetailKey,
                        type               : "tedetailExceptions"
                     }
                  });
               }),250);
            }
         }
      });

   }
   catch(e) {
      console.log(e);
   }
}

我做错了什么?

修改

我设法用以下代码解决了这个问题。当我不需要时,重新加载数据存储是非常愚蠢的!

function deleteTEDetailExceptions() {
   try {

      if(tedetailExceptionsEditorGrid.getSelectionModel().selected.length < 1) {
         statusMessage("Please select an exception first", true);
         return;
      }

      var record = tedetailExceptionsEditorGrid.getSelectionModel().selected.items[0];
      tedetailExceptionsEditorGrid.getView().refresh();

      currentTEDetailExceptionKey = record.data["tedetailExceptionKey"];

      // send the delete request
      Ext.Ajax.request({
         url: '/timesheets/action.do',
         method: 'POST',
         params:{
            tedetailExceptionKey : currentTEDetailExceptionKey,
            type                 : "tedetailExceptions",
            "delete"             : "true"
         },
         success: function(response) {
            if(response.statusText == "OK") {
               TEDetailExceptionsStore.remove(record);
            }
         }
      });

   }
   catch(e) {
//      console.log(e);
   }
}

1 个答案:

答案 0 :(得分:2)

我不确定你删除记录后为什么要重新加载数据。您是否也在使用分页工具栏?

ExtJs显然认为在最后一行中有一条记录,并且在重新加载数据存储之前,您正在重新加载所有数据,并尝试调用TEDetailExceptionsStore.removeAll()。

另一种可能是从商店中删除记录后刷新网格视图。您可以使用grid.getView()。refresh()这可能会强制ExtJS识别最后一行不包含记录