EasyUI editable datagrid plugin削除に失敗した解決方法
5602 ワード
最近EasyUIを勉強していますが、今日は公式のチュートリアルに従ってeditable datagridの例を作りました.公式のチュートリアルはここです.http://www.jeasyui.com/tutorial/app/crud2.php.私のフロントコードは基本的に公式チュートリアルと同じですが、私が使っているThinkphpでバックグラウンド操作のデータプロセスを書きます.
フロントコード:
大体のインタフェースはこうです.
追加と修正機能は正常に使用できますが、jを削除すると、フロントがバックグラウンドから戻ってきたjsonを取得するとjsがエラーを報告します.
明らかに公式サイトとそっくりなコードですが、削除できません・・・後でjqueryを見てみました.edatagrid.jsのソースコード、削除の機能は具体的にdestroyRowという関数によって実行され、関数のソースコードが見つかり、私のエラーがフロントでjsonがデータを返すのを処理する時に現れたので、ajax処理のコードがあるかどうかを直接探して、このような関数があることを発見しました:
中間postがajaxをコミットする部分に重点を置いて、postがajaxをコミットする次の行のコードに問題があることを長い間デバッグしました.
この関数の役割は,ユーザが選択した行のデータのプライマリコード(idValueという値)から,インタフェースに表示されるデータテーブルの行番号に変換することである.例えば、私の例では、ユーザーはkevinという行のデータを削除することを選択し、kevinという行のデータは私のデータベースのプライマリコードidが33であり、最初の行に表示されるので、この関数は33を0(データテーブルの行番号が0から始まる)に変換し、戻り値0をindexに割り当て、indexに対して具体的な削除プロセスを実行します.出力をデバッグしてみると、私の例で出力されたindexはいつも-1で、getRowIndexという関数が問題になっているようです.公式チュートリアルによると、この関数には2つのパラメータ形式があります.
ソースコードに使われているのがidの形式なので、idValueパラメータをrow(このパラメータはユーザーが選択した行のオブジェクト)に変えてみましたが、成功しました!jsエラーは発生せず、正常に削除できます.具体的に何が原因なのかはまだ分かりませんが、もし名手が原因を知っているか、あるいは私のどこの操作ミスを指摘してほしいです.
フロントコード:
Basic CRUD Application - jQuery EasyUI CRUD Demo
$(function(){
$('#dg').edatagrid({
url: '/Test/Admin/Easyui/getAll', // , Thinkphp
/*A URL to save data to server and !return the added row.!*/
saveUrl: '/Test/Admin/Easyui/insertFromEG',
updateUrl: '/Test/Admin/Easyui/updateFromEG',
/* json !echo json_encode(array('success'=>true));*/
destroyUrl: '/Test/Admin/Easyui/deleteFromEG', // Thinkphp
destroyMsg:{
norecord:{ // when no record is selected
title:'Warning',
msg:'No record is selected.'
},
confirm:{ // when select a row
title:'Confirm',
msg:'Are you sure you want to delete?'
}
},
});
});
Test EasyUI, DataGrid
First Name
Last Name
Phone
Email
大体のインタフェースはこうです.
追加と修正機能は正常に使用できますが、jを削除すると、フロントがバックグラウンドから戻ってきたjsonを取得するとjsがエラーを報告します.
明らかに公式サイトとそっくりなコードですが、削除できません・・・後でjqueryを見てみました.edatagrid.jsのソースコード、削除の機能は具体的にdestroyRowという関数によって実行され、関数のソースコードが見つかり、私のエラーがフロントでjsonがデータを返すのを処理する時に現れたので、ajax処理のコードがあるかどうかを直接探して、このような関数があることを発見しました:
function _del(row){
var index = dg.datagrid('getRowIndex', row);
if (index == -1){return}
if (row.isNewRecord){
dg.datagrid('cancelEdit', index);
} else {
if (opts.destroyUrl){
var idValue = row[opts.idField||'id'];
$.post(opts.destroyUrl, {id:idValue}, function(data){
var index = dg.datagrid('getRowIndex', index);
// alert(index+" "+idValue);
if (data.isError){
dg.datagrid('selectRow', index);
opts.onError.call(dg[0], index, data);
return;
}
if (opts.tree){
dg.datagrid('reload');
var t = $(opts.tree);
var node = t.tree('find', idValue);
if (node){
t.tree('remove', node.target);
}
} else {
dg.datagrid('cancelEdit', index);
dg.datagrid('deleteRow', index);
}
opts.onDestroy.call(dg[0], index, row);
var pager = dg.datagrid('getPager');
if (pager.length && !dg.datagrid('getRows').length){
dg.datagrid('options').pageNumber = pager.pagination('options').pageNumber;
dg.datagrid('reload');
}
}, 'json');
} else {
dg.datagrid('cancelEdit', index);
dg.datagrid('deleteRow', index);
opts.onDestroy.call(dg[0], index, row);
}
}
}
中間postがajaxをコミットする部分に重点を置いて、postがajaxをコミットする次の行のコードに問題があることを長い間デバッグしました.
var index = dg.datagrid('getRowIndex', idValue);
この関数の役割は,ユーザが選択した行のデータのプライマリコード(idValueという値)から,インタフェースに表示されるデータテーブルの行番号に変換することである.例えば、私の例では、ユーザーはkevinという行のデータを削除することを選択し、kevinという行のデータは私のデータベースのプライマリコードidが33であり、最初の行に表示されるので、この関数は33を0(データテーブルの行番号が0から始まる)に変換し、戻り値0をindexに割り当て、indexに対して具体的な削除プロセスを実行します.出力をデバッグしてみると、私の例で出力されたindexはいつも-1で、getRowIndexという関数が問題になっているようです.公式チュートリアルによると、この関数には2つのパラメータ形式があります.
ソースコードに使われているのがidの形式なので、idValueパラメータをrow(このパラメータはユーザーが選択した行のオブジェクト)に変えてみましたが、成功しました!jsエラーは発生せず、正常に削除できます.具体的に何が原因なのかはまだ分かりませんが、もし名手が原因を知っているか、あるいは私のどこの操作ミスを指摘してほしいです.