验证SlickGrid的所有行中的所有单元格

jwl*_*jwl 5 javascript slickgrid

给定SlickGrid,如何触发所有行中的所有单元格进行验证?或者也许使用JavaScript来触发一次要验证的单元格(然后我可以对所有行中的所有单元格使用)?

用例是用户必须编辑每个单元格并提供默认值之外的用例,并且我们希望确保它们已经这样做,并且我们希望显示默认验证错误行为(如果它们没有).

目前看来验证仅发生在编辑的字段上.

Ori*_*eil 2

正如所观察到的,Slickgrid 的默认验证仅限于编辑器validate的功能,该功能检查任何可用的仅将值作为参数传递的功能。为了提供额外的上下文信息,需要自定义编辑器,或更具体地说,需要自定义验证功能。validator

this.validate = function() {
   if (args.column.validator) {
       args.newValue = $input.val()
       var validationResults = args.column.validator(args);

       if (!validationResults.valid) {
          return validationResults;
       }
   }

  return { valid: true, msg: null };
};
Run Code Online (Sandbox Code Playgroud)

然后,每一列都需要一个验证器,在该验证器中,将根据来自编辑器的新值或现有值以及任何其他所需的验证方面来检查默认值。

var Validator = function(args) {

  //validate the existing value or the incoming editor value
  var value = args.newValue ? args.newValue : args.item[args.column.field]
  var result = value > 0 
  return {valid: result}
}
Run Code Online (Sandbox Code Playgroud)

为了验证整个网格,请提供一种验证方法,该方法迭代每一行,查看验证器的每一列。rowIndex -> collection of failures根据验证结果,建立一个关系映射以传递给本机onValidationError事件。这允许订阅来处理存在错误的用户通知。此外,通过向网格提供特定的元数据,验证结果可用于设计失败的样式

var validateColumns = function(args){

 var failures=[];

 for (c in columns) {
   var column = columns[c]
   if (column.validator) {
      if(!column.validator({row: args.row, item: args.item, column: column}).valid){
         failures.push({columnIndex: c, column: column, rowIndex: args.row, item: args.item})
      }
   }
 }
 return failures;
}

grid.validate = function() {
   var rowFailures = {}
   for (r in data) {
     //ignore our metadata provider (if applicable)
     if(r == 'getItemMetadata'){continue;}

     var failures = validateColumns({item: data[r], row: r})
     if(failures.length > 0){
       rowFailures[r] = failures;
     }
    }

    if(Object.keys(rowFailures).length > 0){
     grid.onValidationError.notify({"rowFailures": rowFailures}, new Slick.EventData())
    }
   }
Run Code Online (Sandbox Code Playgroud)

小提琴