所以,这是我使用ajaxForm从表单提交回调后的代码:
function UpdateFormFinished(response, statusText, xhr, $form) {
if (response['bResult'] == true) {
var sTestType = $("#sTestType").val();
var sTableId = "";
for (index in response) {
if (typeof response[index] !== "function" && index != "bResult" && index != "sResult") {
aRowIdPieces = index.split("_");
sChar = aRowIdPieces[1];
iColumn = $("#" + index).prevUntil(index).length;
sTableId = $("#" + sTestType + "_" + sChar).parent().parent().attr("id");
oTable = $("#" + sTableId).dataTable();
oTable.fnUpdate(response[index], $("#ixDataTable").val(), iColumn);
}
}
}
alert(response['sResult']);
$("#dialog_test_details").dialog("close");
}
if之后的第一行从表单本身的隐藏输入中检索值。变量“index”的值为“someWord_X”,其中“X”是整数。 iColumn存储我想要更新的列/单元格的索引(我知道编号从零开始,这意味着prevUntil返回我想要更新的列/单元格的索引)。最后,“ixDataTable”是表单上的另一个隐藏输入并返回一个整数(我已经使用console.log验证了这一点,以输出该值)。
所以,从我能看到的一切,我将好的值传递给fnUpdate,但是我收到错误“无法读取未定义的属性'nTr'”。我查看了堆栈跟踪,问题从dataTables(v1.9.4)中的第6188行开始,这就是这一行:
_fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay;
堆栈跟踪进行到第4661行,我在这里复制了第4660到4689行:
oData = oSettings.aoData[iRow];
if ( oData.nTr !== null )
{
/* get the TD child nodes - taking into account text etc nodes */
anTds = [];
nTd = oData.nTr.firstChild;
while ( nTd )
{
sNodeName = nTd.nodeName.toLowerCase();
if ( sNodeName == 'td' || sNodeName == 'th' )
{
anTds.push( nTd );
}
nTd = nTd.nextSibling;
}
iCorrector = 0;
for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
{
if ( oSettings.aoColumns[iColumn].bVisible )
{
anReturn.push( anTds[iColumn-iCorrector] );
}
else
{
anReturn.push( oData._anHidden[iColumn] );
iCorrector++;
}
}
}
任何有关如何解决这个问题的建议都将受到高度赞赏,并将进行尝试。我已经验证了表ID是正确的,我也尝试将列索引递增1,这些都没有产生积极的影响。我也试过传递:
ixDataTable = sTestType + "_" + sChar;
作为fnUpdate的第二个参数,但它也不喜欢接收要更新的行的id。
提前感谢您,希望这是一个非常简单的解决方法。
答案 0 :(得分:11)
由于这个引用的代码似乎已经过时,我有另一个可能的错误修复任何遇到此问题的人。 只要在选项中定义,就会出现此行为:
"pageLength": "30" //bad
而不是
"pageLength": 30 //good
DataTables将其内部计数器解释为030,这会导致此错误。
答案 1 :(得分:1)
我发现了问题,它就在这里:
oTable.fnUpdate(response[index], $("#ixDataTable").val(), iColumn);
具体来说,它的值为$("#ixDataTable").val()
,因为它的计算结果为字符串。所以,我实际上必须编写这样的代码:
oTable.fnUpdate(response[index], parseInt($("#ixDataTable").val()), iColumn);
希望这可以帮助那些可能遇到这种情况并且无法理解原因的人。