我正在尝试将Handsontable实施到我们的报告系统中。除了一件事,我做了我想做的一切。我正在使用渲染器突出显示错误单元格(只需在背景上设置红色)。但是,当我按上下文菜单 - >删除行删除时,所有渲染器都保留在其x-y位置。我希望他们能够跟随他们的行。
$container.handsontable({
data: data,
rowHeaders: true,
colHeaders: true,
minSpareRows: 1,
contextMenu: true,
stretchH: 'all',
comments: true,
cells: function(row, col, prop) {
var cellProperties = {};
{foreach $excelError as $error}
if (row === {$error['row']} && col === {$error['col']}) {
cellProperties.renderer = {$error['renderer']};
cellProperties.comment = {$error['desc']};
}
{/foreach}
if (row === 0) {
cellProperties.renderer = firstRowRenderer;
}
return cellProperties;
}
});
尽管变量名称为$ error,但它也包含正确的行数据,这些数据只会使白色的单元格变形。 errorRenderer函数看起来像这样(白色类似于这个)
var errorRenderer = function(instance, td, row, col, prop, value, cellProperties) {
Handsontable.renderers.TextRenderer.apply(this, arguments);
$(td).css({
background: 'red',
color: "white",
fontWeight: "bold"
});
};
知道如何解决这个问题吗?即使只是捕获了删除行事件,我也可以,因为我可以调用ajax并再次重新渲染单元格。
感谢您的任何想法。
修改
固定解决方案:
var cellsProp = new Array();
{foreach $excelError as $error}
cellsProp[{$error['row']}] = new Array();
cellsProp[{$error['row']}][{$error['col']}] = {$error['renderer']|noescape};
{/foreach}
var removing = false;
$container.handsontable({
data: data,
rowHeaders: true,
colHeaders: true,
minSpareRows: 1,
contextMenu: true,
stretchH: 'all',
comments: true,
cells: function(row, col, prop) {
var cellProperties = {};
if (typeof cellsProp[row] != "undefined") {
cellProperties.renderer = cellsProp[row][col];
}
if (row === 0) {
cellProperties.renderer = firstRowRenderer;
}
return cellProperties;
},
beforeRemoveRow: function(index, amount) {
if (removing == false) {
for (x = index; x < cellsProp.length; x++) {
cellsProp[x] = cellsProp[x+1];
}
}
removing = true;
},
afterRemoveRow: function(index, amount) {
removing = false;
}
});
答案 0 :(得分:0)
错误发生在PHP中。删除行时,PHP仍然认为特定行索引出错。如果你能提供一个可以从PHP中删除一行的函数,我们可以创建一个函数beforeRemoveRow
,该函数在删除一行后触发。
在这里,我们可以调用您的PHP函数并为其提供要删除的行索引。你的程序现在应该可以工作了。
该函数将如下所示,并将添加到热定义的选项列表中:
beforeRemoveRow: function(index, amount) {
phpFunctionRemoveRow(index);
}
编辑:
使用这种硬编码坐标的逻辑,删除一行总会给你转动(x,y)红色的行为。这就是有一个&#34;错误&#34;在你的PHP。这意味着,由于您收到来自PHP的错误坐标,因此您无法预期硬编码索引值会发生变化。
某些事情仍然没有意义。如果你在渲染后没有与PHP交互(你不会在渲染后调用它),并且你说PHP是正确的,那么这是否意味着你永远不会修改你的表?如果有人做出改变并且你必须重新验证你的桌子怎么办?
但是,如果你有能力做到这一点,那么我将做的是:
更改表后,调用php函数重新验证。这将改变你在php中的错误数组,但由于cells
选项是静态的,你不会看到更改。此时,您将使用:
hotInstance.updateSettings({ cells: getCellsAgain() });
在该功能getCellsAgain()
中,您再次调用您的PHP代码告诉您新的权限。如果没有在JS方面进行验证,那将是最好的。