【问题标题】:New row in slickgrid, Validator does not fireslickgrid 中的新行,验证器不会触发
【发布时间】:2012-08-13 15:17:07
【问题描述】:

我为我的一列配置了 requiredFieldValidator,它对现有行按预期工作。当我通过 Tab 或单击开始编辑新行时,验证器在移出该列时不会触发。当移出新行(列中没有数据)以便提交,然后移回该行时,现在验证器可以工作......但只有当我在编辑器中放入一些数据,然后删除它时。

换句话说,对于新行,requiredFieldValidator 不会执行任何操作,直到我在列中实际键入内容。如果我将一列留空,它将永远不会触发,从而违背了它的目的。有趣的是,他们提供的示例 (http://mleibman.github.com/SlickGrid/examples/example3-editing.html) 也存在同样的问题。

【问题讨论】:

    标签: slickgrid


    【解决方案1】:

    这会检查两个值是否都是“”。我相信这应该返回 true,因为验证器可能是“必需的”验证器。

     this.isValueChanged = function () {
      // this needs to validate if both are empty since a validator might be a "required" validator
      if ($input.val() == "" && defaultValue == "")
        return true;
      else 
        return (!($input.val() == "" && defaultValue == "")) && ($input.val() != defaultValue);
    };
    

    首选方法是创建一个自定义编辑器,这样您就不会与核心库搞混了。

    【讨论】:

      【解决方案2】:

      我同意,我自己也遇到过这种行为。 这是解决方案。

      将this.isValueChanged函数内容改为如下。

      if(($input.val().length > 0) && ($input.val() != defaultValue))
                  return true;
          else if(($input.val() == defaultValue)&&($input.val().length > 0))
                  return true;
          else if(($input.val().length == 0) && ((undefined === defaultValue )||(defaultValue == "")))
                  return true;
          else
                  return false;
      

      由于某种原因,在第一次交互期间未设置 defaultValue,我猜如果您将其初始化为“”,则无需检查未定义。

      无论如何,defaultValue 保存单元格的前一个值,因此当它为空并且是正在编辑的第一个单元格时,它是未定义的,之后对于所有其他空单元格,它被设置为“”。

      问题是这个函数需要告诉网格值已经改变,以便单元格编辑器验证输入。在提供的实现中,表达式总是返回 false,因为

      $input.val() == "" evaluates to true and then the expression 
      !($input.val() == "" && defaultValue == null)) evaluates to false
      

      这意味着 defaultValue 一直是未定义的。

      希望这是有道理的,我的代码可以帮助你。

      【讨论】:

        【解决方案3】:

        有同样的问题,我相信理想情况下 defaultValue 应该设置为 undefined 或 null,当它没有被初始化时。所以我通过以下方式修改了TextEditor:

        function TextEditor(args) {
            var $input;
            var defaultValue;
            var scope = this;
        
            this.loadValue = function (item) {
                defaultValue = item[args.column.field] || null;
                $input.val(defaultValue);
                $input[0].defaultValue = defaultValue;
                $input.select();
            };
        
            this.isValueChanged = function () {
                return $input.val() != defaultValue;
            };
        
            ....
        

        将默认 defaultValue 设置为 null 并简化 isValueChanged。

        【讨论】:

          【解决方案4】:

          Roman 的第一个 else if 有错误,返回 false。否则,即使值未更改,单元格中的任何更改都会返回 true。 我试过了,效果很好。

          this.isValueChanged = function () {
                  var attuale = $input.val();
                  if((attuale.length > 0) && (attuale != defaultValue))
                      return true;
                  else if((attuale == defaultValue)&&(attuale.length > 0))
                      return false;
                  else if((attuale.length == 0) && ((undefined === defaultValue )||(defaultValue == "")))
                      return true;
                  else
                      return false;
          };
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-20
            • 2013-10-14
            • 2020-02-21
            • 2017-04-22
            • 2021-12-23
            • 2019-04-08
            相关资源
            最近更新 更多