【问题标题】:SlickGrid select editorSlickGrid 选择编辑器
【发布时间】:2011-03-13 19:43:03
【问题描述】:

我想为选择单元格进行动态填充的 html 选择。我从数据库中提取了一些信息,这些信息对于每个行项都不同。问题是编辑器丢失了初始数据,我不知道如何为特定单元格保留一些数据。以前有人这样做过吗?

function StandardSelectCellEditor($container, columnDef, value, dataContext) {
var $input;
var $select;
var defaultValue = value;
var scope = this;

this.init = function() {
    $input = $("<INPUT type=hidden />");
    $input.val(value); 
    }

    $input.appendTo($container);

    $select = $("<SELECT tabIndex='0' class='editor-yesno'>");
    jQuery.each(value, function() {
      $select.append("<OPTION value='" + this + "'>" + this + "</OPTION></SELECT>");
    });
    $select.append("</SELECT>");

    $select.appendTo($container);

    $select.focus();
};


this.destroy = function() {
    //$input.remove();
    $select.remove();
};


this.focus = function() {
    $select.focus();
};

this.setValue = function(value) {
    $select.val(value);
    defaultValue = value;
};

this.getValue = function() {
    return $select.val();
};

this.isValueChanged = function() {
    return ($select.val() != defaultValue);
};

this.validate = function() {
    return {
        valid: true,
        msg: null
    };
};

this.init();
};

【问题讨论】:

标签: javascript jquery slickgrid


【解决方案1】:

有人问了here 类似的问题(但这个问题没有标记为 slickgrid)。

我确实做了一个 SelectEditor,根据我们所在的列提供灵活的选项范围。这里考虑的原因是您在列中编辑的值的数据类型将决定该字段的有效选择。

为此,您可以在列定义中添加一个额外的选项(例如,称为选项),如下所示:

 var columns = [
  {id:"color", name:"Color", field:"color",  options: "Red,Green,Blue,Black,White", editor: SelectCellEditor}
  {id:"lock", name:"Lock", field:"lock",  options: "Locked,Unlocked", editor: SelectCellEditor},

]

并在您自己的 SelectEditor 对象的 init 方法中使用 args.column.options 访问它,如下所示:

 SelectCellEditor : function(args) {
        var $select;
        var defaultValue;
        var scope = this;

        this.init = function() {

            if(args.column.options){
              opt_values = args.column.options.split(',');
            }else{
              opt_values ="yes,no".split(',');
            }
            option_str = ""
            for( i in opt_values ){
              v = opt_values[i];
              option_str += "<OPTION value='"+v+"'>"+v+"</OPTION>";
            }
            $select = $("<SELECT tabIndex='0' class='editor-select'>"+ option_str +"</SELECT>");
            $select.appendTo(args.container);
            $select.focus();
        };

        this.destroy = function() {
            $select.remove();
        };

        this.focus = function() {
            $select.focus();
        };

        this.loadValue = function(item) {
            defaultValue = item[args.column.field];
            $select.val(defaultValue);
        };

        this.serializeValue = function() {
            if(args.column.options){
              return $select.val();
            }else{
              return ($select.val() == "yes");
            }
        };

        this.applyValue = function(item,state) {
            item[args.column.field] = state;
        };

        this.isValueChanged = function() {
            return ($select.val() != defaultValue);
        };

        this.validate = function() {
            return {
                valid: true,
                msg: null
            };
        };

        this.init();
    }

【讨论】:

  • 您真的需要为每个单独的字段提供不同的选择选项吗?如果是这样,您可以考虑将每个字段本身编码为具有值及其选项的对象(例如“蓝色|红色,绿色,蓝色,黑色,白色”)。您需要一个额外的 CellFormatter 来显示该值,并且您可以更改 CellEditor 代码以从“|”符号后的值中获取选项。注意在编辑完成后写回包含选项列表的值,以免丢失此信息...
【解决方案2】:

您可以稍微修改上面的 SelectCellEditor 来为每个单元格创建不同的选择选项。

function SelectCellEditor(args) {

   .....

   // just to get the DOM element
   this.getInputEl = function() {
      return $input;
   };
}

现在创建动态下拉编辑器很容易。

function DynamicSelectCellEditor(args) {
   // 1: if you already have a select list for individual cells
   args.columns.options = optionsList[args.item.id] // or any custom logic
   return new Slick.Editors.SelectCellEditor(args);

   /*              OR                */

   // 2: if data needs to be fetched from the server
   var editor = new Slick.Editors.SelectCellEditor(args),
       $select = editor.getInputEl();

   $select.html("<option>Loading...</option>");
   $.ajax({ }).done(function(list) {
       // Update select list
       $select.html(newHtml);
   });

   return editor;
}

【讨论】:

    【解决方案3】:

    替换

    for( i in opt_values ){
              v = opt_values[i];
              option_str += "<OPTION value='"+v+"'>"+v+"</OPTION>";
    }
    

    $.each(opt_values , function( index, value ) {
        option_str += "<OPTION value='"+value+"'>"+value+"</OPTION>";
    });
    

    如果它不适合你

    【讨论】:

      【解决方案4】:

      请尝试以下代码。

      在 slick.editors.js 中,定义一个新的编辑器。

      $.extend(true, window, {
          "Slick": {
            "Editors": {
             "SelectOption": SelectCellEditor,
             .....
            }
          }
        });
      function SelectCellEditor(args) {
          var $select;
          var defaultValue;
          var scope = this;
          var s;
          this.init = function() {
              opt_values = eval(args.column.options);
              option_str = "";
              var tuples = [];
              for (var key in opt_values) tuples.push([key, opt_values[key]]);
              tuples.sort(function(a, b) { return a[1] < b[1] ? 1 : a[1] > b[1] ? -1 : 0 });
              var length = tuples.length;
              while (length--) option_str += "<OPTION value='"+tuples[length][0]+"'>"+tuples[length][1]+"</OPTION>";
      
              $select = $("<SELECT tabIndex='0' class='editor-select'>"+ option_str +"</SELECT>");
              $select.appendTo(args.container);
              $select.focus();
          };
      
          this.destroy = function() {
              $select.remove();
          };
      
          this.focus = function() {
              $select.focus();
          };
      
          this.loadValue = function(item) {
              defaultValue = item[args.column.field];
              $select.val(defaultValue);
          };
      
          this.serializeValue = function() {
                return $select.val();
          };
      
          this.applyValue = function(item,selectedIndex) {
              if($.isNumeric(selectedIndex))
                  item[args.column.field] = parseInt(selectedIndex);
              else
                  item[args.column.field] = selectedIndex;
          };
      
          this.isValueChanged = function() {
              return ($select.val() != defaultValue);
          };
      
          this.validate = function() {
              return {
                  valid: true,
                  msg: null
              };
          };
      
          this.init();
      }
      

      然后,修改您的网格选项

      var grid_options = {
      editable:             true,
      enableAddRow:       false,
      multiColumnSort:    true,
      explicitInitialization: true,
       dataItemColumnValueExtractor: function(item, columnDef) {
       if(columnDef.editor == Slick.Editors.SelectOption){
          return eval(columnDef.options)[item[columnDef.field]];
        }else{
          return item[columnDef.field];
        }
      }
      

      };

      并在列初始化时使用编辑器。

      {id: "currency_id", name: "Currency *", field: "currency_id", editor: Slick.Editors.SelectOption, options: { 1: 'Dollar', 2: 'Yen', 3: 'Rupiah' }, sortable: true,width: 234}
      

      【讨论】:

        【解决方案5】:

        我还不能添加 cmets,但我需要在 HeiN 的答案中添加一些内容。

        HeiN 的回答效果很好,但是我输入的数据与我的选择选项不匹配,我仍然需要显示该数据......所以我不得不修改选项中的 dataItemColumnValueExtractor。如果列表中没有要匹配的选项,这将允许显示我的原始数据。

                dataItemColumnValueExtractor: function(item, columnDef) {
                    if(columnDef.editor == Slick.Editors.SelectOption){
                        return eval(columnDef.options)[item[columnDef.field]] != null ? eval(columnDef.options)[item[columnDef.field]] : item[columnDef.field];
                    }else{
                        return item[columnDef.field];
                    }
                }
        

        希望这对以后的人有所帮助。

        【讨论】:

          猜你喜欢
          • 2020-02-20
          • 2013-03-05
          • 2017-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-31
          • 1970-01-01
          相关资源
          最近更新 更多