给定SlickGrid,如何触发所有行中的所有单元格进行验证?或者也许使用JavaScript来触发一次要验证的单元格(我可以对所有行中的所有单元格使用它)?
用例必须是用户必须编辑每个单元格并提供除默认值之外的其他内容,并且我们要确保他们已经这样做和我们要显示默认的验证错误行为如果他们没有。
目前似乎验证仅发生在已编辑的字段上。
答案 0 :(得分:2)
正如所观察到的,Slickgrid的默认验证仅限于editor的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 };
};
然后,每列都需要一个验证器,在该验证器中,将根据来自编辑器的新值或现有值以及任何其他所需的验证方面检查默认值。
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}
}
要验证整个网格,请提供一种验证方法,该方法迭代每行,查看验证器的每一列。根据验证结果,构建rowIndex -> collection of failures
的关系映射以传递给本机onValidationError
事件。这允许订阅处理用户存在错误的通知。此外,验证结果可用于providing specific metadata to the grid
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())
}
}