Handsontable:删除行后更新渲染器

时间:2015-04-05 16:29:53

标签: javascript jquery handsontable

我正在尝试将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;
        }
    });

1 个答案:

答案 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方面进行验证,那将是最好的。