为什么自定义渲染器不像预期的那样工作,并导致奇怪的表单元格行为

Why custom renderer do not work as expected and cause strange table cells behavior?

本文关键字:单元格 表单 工作 自定义 为什么      更新时间:2023-09-26

为什么我的自定义渲染器在handsontable中导致奇怪的细胞行为?当我尝试编辑单元格时,然后光标自动下降到其他单元格,其他单元格混乱,整个编辑过程从那一刻起崩溃。

我需要根据值给一些单元格上色这就是为什么我需要使用一些机制,我在列定义中选择了定义类型,像这样:

columns: { data: "some-property", type: {renderer: colorRenderer, editor:colorRenderer}}

不幸的是,当我这样做时,在单元格编辑期间会发生一些奇怪的行为。请在这里看看jsfiddle: http://jsfiddle.net/6QEtF/3/第191行是有问题的问题

我如何在不使用渲染器的情况下以其他方式对细胞着色,或者我的渲染器有什么问题?

请帮…

这是我的示例代码,完全工作是在JsFiddle(上面的链接)。

var COLUMN_TYPES = new Object();
// JSON fetched via Ajax from backend:
var res = getJSON();
// Create grid header names and definitions based on fetched JSON:
var column_names = [];
var column_defs = [];
for (var i=0; i<res.headers.length; i++) {
    column_names[i] = res.headers[i].name;
    column_defs[i] = {
        data: "valueDTO." + i + ".value", 
        type: {renderer: colorRenderer, editor:colorEditor}, // 1 way <--- cause a problem! 
        //type: res.headers[i].type,    // 2nd way is correct but without custom renderer which I need to colorize some cells.
        source: res.headers[i].sources, 
        readOnly: res.headers[i].readOnly, 
        strict: res.headers[i].strict
    };
    COLUMN_TYPES["valueDTO."+i+".value"] = res.headers[i].type;
}
// Create grid table:
createHandsontable(res.rows, column_names, column_defs, res.values);
function createHandsontable(row_names, column_names, column_defs, values) {
    var $container = $("#spreadsheet");
    var $parent = $container.parent();
    $container.handsontable({
      startRows: 4,
      startCols: 20,
      manualColumnResize: true,
      manualColumnMove: true,
      columnSorting: true,
      contextMenu: true,
      rowHeaders: row_names,
      colHeaders: column_names, //grid.headers,
      data: values, // data init only once at start
      columns: column_defs,
      cells: function (row, col, prop) {
          //return {type: {renderer: colorRenderer, editor: colorEditor}};
      }
    });
}
function colorRenderer (instance, td, row, col, prop, value, cellProperties) {
    switch (COLUMN_TYPES[prop]) {   
        case 'text':
            Handsontable.TextCell.renderer.apply(this, arguments);
            Handsontable.TextCell.editor.apply(this, arguments);
            if (value != null) {
                if (value.toString().toLowerCase() === "green") {
                    $(td).css({
                        background: '#00DC00'
                    });
                }
                else if (value.toString().toLowerCase() === "amber") {
                    $(td).css({
                        background: '#FAE600'
                    });
                }
                else if (value.toString().toLowerCase() === "red") {
                    $(td).css({
                        background: 'red'
                    });
                }
            }   
            break;
        case 'autocomplete':
            Handsontable.AutocompleteCell.renderer.apply(this, arguments);
            Handsontable.AutocompleteCell.editor.apply(this, arguments);
            break;
        case 'checkbox':
            Handsontable.CheckboxCell.renderer.apply(this, arguments);
            Handsontable.CheckboxCell.editor.apply(this, arguments);
            break;
        case 'numeric':
            Handsontable.NumericCell.renderer.apply(this, arguments);
            Handsontable.NumericCell.editor.apply(this, arguments);
            break;
        case 'date':
            Handsontable.DateCell.renderer.apply(this, arguments);
            Handsontable.DateCell.editor.apply(this, arguments);
            break;
        case 'handsontable':
            Handsontable.HandsontableCell.renderer.apply(this, arguments);
            Handsontable.HandsontableCell.editor.apply(this, arguments);
            break;
        default:
            Handsontable.TextCell.renderer.apply(this, arguments);
            Handsontable.TextCell.editor.apply(this, arguments);
            break;
    }
};
function colorEditor (instance, td, row, col, prop, value, cellProperties) {
    switch (COLUMN_TYPES[prop]) {   
        case 'text':
            Handsontable.TextCell.renderer.apply(this, arguments);
            Handsontable.TextCell.editor.apply(this, arguments);
            break;
        case 'autocomplete':
            Handsontable.AutocompleteCell.renderer.apply(this, arguments);
            Handsontable.AutocompleteCell.editor.apply(this, arguments);
            break;
        case 'checkbox':
            Handsontable.CheckboxCell.renderer.apply(this, arguments);
            Handsontable.CheckboxCell.editor.apply(this, arguments);
            break;
        case 'numeric':
            Handsontable.NumericCell.renderer.apply(this, arguments);
            Handsontable.NumericCell.editor.apply(this, arguments);
            break;
        case 'date':
            Handsontable.DateCell.renderer.apply(this, arguments);
            Handsontable.DateCell.editor.apply(this, arguments);
            break;
        case 'handsontable':
            Handsontable.HandsontableCell.renderer.apply(this, arguments);
            Handsontable.HandsontableCell.editor.apply(this, arguments);
            break;
        default:
            Handsontable.TextCell.renderer.apply(this, arguments);
            Handsontable.TextCell.editor.apply(this, arguments);
            break;
    }
};

尝试升级到最新版本:

http://handsontable.com/

看一下条件格式