我有一个由GridPanel
(ExtJS 4)支持的DataStore
。好的,所以当用户选择一行并单击删除按钮时,我向服务器发送POST
请求,其中包含所选记录的ID,删除记录,然后在返回时重新加载数据存储
记录成功删除,服务器返回状态代码OK
。但是,如果用户选择GridPanel
的最后一行,我会收到以下错误:
未捕获的TypeError:无法读取未定义的属性“id”
我在Grid Panel
或DataStore
上没有其他活动。
这是我的删除代码:
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);
}
}
答案 0 :(得分:2)
我不确定你删除记录后为什么要重新加载数据。您是否也在使用分页工具栏?
ExtJs显然认为在最后一行中有一条记录,并且在重新加载数据存储之前,您正在重新加载所有数据,并尝试调用TEDetailExceptionsStore.removeAll()。
另一种可能是从商店中删除记录后刷新网格视图。您可以使用grid.getView()。refresh()这可能会强制ExtJS识别最后一行不包含记录