【问题标题】:Handsontable Select2 Dynamic OptionsHandsontable Select2 动态选项
【发布时间】:2015-10-10 18:30:12
【问题描述】:

我在 select2 编辑器中使用 handsontable,但我似乎无法使动态选项与下拉菜单一起使用,即在 handsontable 初始化时设置的选项似乎是唯一显示的选项。

我尝试使用全局变量作为选项的来源,并在我的代码中的各个点更新它,还使用函数返回相同的变量,但似乎都没有尝试。

例如

var hot;
var data = [];

function customDropdownRenderer(instance, td, row, col, prop, value, cellProperties) {

    if (instance.getCell(row, col)) {
        $(instance.getCell(row,col)).addClass('select2dropdown');
    }

    var selectedId;

    var colOptions = cellProperties.select2Options.data;

    if (colOptions != undefined) {

        for (var index = 0; index < colOptions.length; index++) {
            if (parseInt(value) === colOptions[index].id) {
                selectedId = colOptions[index].id;
                value = colOptions[index].text;            
            }
        }

        Handsontable.TextCell.renderer.apply(this, arguments);
    }
}

var  requiredText = /([^\s])/;

$(document).ready(function(){

    var
      $container = $("#example1"),
      $parent = $container.parent(),
      autosaveNotification;


    hot = new Handsontable($container[0], {
        columnSorting: true,
        stretchH: 'all',
        startRows: 8,
        startCols: 5,
        rowHeaders: true,
        colHeaders: ['Description', 'Cost', 'Remarks'],
        columns: [
            { data: 'description' },
            { 
                data: 'cost',
                editor: 'select2',
                renderer: customDropdownRenderer,
                select2Options: { data: getData(), dropdownAutoWidth: true }
            },
            { data: 'remarks' },
        ],
        minSpareCols: 0,
        minSpareRows: 1,
        contextMenu: true,
        data: []
    });

    data = [{id:'fixed',text:'Fixed'},{id:'variable',text:'Variable'}];
});

function getData() {
    return data;
}

http://jsfiddle.net/zfmdu4wt/27/

【问题讨论】:

    标签: javascript jquery jquery-select2 handsontable


    【解决方案1】:

    您已多次定义数据并导致争用。

    以下更改将解决它:

    在 .ready() 函数之后立即定义以下内容:

    var source = [{id:'fixed',text:'Fixed'},{id:'variable',text:'Variable'}];

    并将 select2Options 更新为以下内容:

    select2Options : { data: source, dropdownAutoWidth: true }

    【讨论】:

    • 感谢@mpusarla,我看到你回答了一些实用的问题,它们很有帮助,除非我做错了什么,否则我无法让这个工作正常 - @987654321 @。我同意,data 是一个糟糕的变量名,我没有在我自己的代码和我自己的示例中命名它,因为 ajax 请求,该变量正在几个不同的地方更新。
    • 谢谢,虽然有点奇怪,表格显示的是所选选项的id,而不是text 属性。
    • 它显示的是文本而不是 id。将源更新为 var source = [{id:1,text:'Fixed'},{id:2,text:'Variable'}];试一试。在您的示例中,除了大小写之外,id 和 text 相同。
    【解决方案2】:

    我设法通过重新使用一些代码来解决与 xeditable 插件相同的问题。

    这是更新后的代码:

    var hot;
    var data = [];
    
    function customDropdownRenderer(instance, td, row, col, prop, value, cellProperties) {
    
      if (instance.getCell(row, col)) {
          $(instance.getCell(row,col)).addClass('select2dropdown');
      }
    
        var selectedId;
    
        var colOptions = cellProperties.select2Options.data;
    
        if (colOptions != undefined) {
    
            for (var index = 0; index < colOptions.length; index++) {
                if (parseInt(value) === colOptions[index].id) {
                    selectedId = colOptions[index].id;
                    value = colOptions[index].text;            
                }
            }
    
            Handsontable.TextCell.renderer.apply(this, arguments);
        }
    }
    
    var  requiredText = /([^\s])/;
    
    $(document).ready(function(){
    
        var
          $container = $("#example1"),
          $parent = $container.parent(),
          autosaveNotification;
    
    
        hot = new Handsontable($container[0], {
            columnSorting: true,
            stretchH: 'all',
            startRows: 8,
            startCols: 5,
            rowHeaders: true,
            colHeaders: ['Description', 'Cost', 'Remarks'],
            columns: [
                { data: 'description' },
                { 
                    data: 'cost',
                    editor: 'select2',
                    renderer: customDropdownRenderer,
                    // select2Options: { data: getData(), dropdownAutoWidth: true }
                    select2Options: { data: getSource(), dropdownAutoWidth: true, width: 'resolve', initSelection: getInitSel(false), query: getQuery }
                },
                { data: 'remarks' },
           ],
           minSpareCols: 0,
           minSpareRows: 1,
           contextMenu: true,
           data: []
        });
    
        data = [{id:'fixed',text:'Fixed'},{id:'variable',text:'Variable'}];
    });
    
    /*
    function getData() {
        return data;
    }
    */
    
    // New Code
    
    function getSource() {
        return data;
    };
    
    function getQuery(options) {
        options.callback({ results : getSource() });
    };
    
    function getInitSel(multiple) {
        return function(el, cb) {
            var t, toSet = [], sc = getSource();
            el[0].value.split(',').forEach(function(a) {
    
                for (var i = 0; i < sc.length; i++) {
                    if (sc[i].id == Number(a.trim())) {
                        t = sc[i];
                    }
                }
    
                // or, if you are using underscore.js
                // t = _.findWhere(sc, { id : Number(a.trim()) });
    
                if(t) toSet.push(t);
            });
            cb(multiple ? toSet : (toSet.length ? toSet[0] : null));
        };
    };
    

    还有一个用于演示的小提琴 - http://jsfiddle.net/zfmdu4wt/38/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-18
      • 2018-06-12
      • 2021-09-03
      • 2015-08-16
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多