在slickgrid中的新行,Validator不会触发

时间:2012-08-13 15:17:08

标签: slickgrid

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

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

4 个答案:

答案 0 :(得分: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);
};

首选方法是创建自定义编辑器,这样您就不会破坏核心库。

答案 1 :(得分:0)

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

将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,我猜你是否将它初始化为“”,你不需要检查undefined。

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

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

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

这意味着defaultValue是未定义的。

希望有意义,我的代码会帮助你。

答案 2 :(得分:0)

有同样的问题,我认为理想情况下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;
    };

    ....

将default defaultValue设置为null并简化isValueChanged。

答案 3 :(得分:0)

如果是罗马的第一个其他错误,则返回为假。否则,即使值未更改,单元格中的任何更改都将返回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;
};