Как отмечалось, проверка Slickgrid по умолчанию ограничивается функцией validate
editor, которая проверяет наличие любого доступного 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())
}
}
Используете ли вы какие-либо другие структуры, которые вы могли бы делегировать эту часть «работы»? Как вы заметили, проверка Slickgrid по умолчанию ограничивается только функцией 'validate'' редактора', которая передает только значение в качестве параметра. Вы можете изменить источник для достижения желаемого поведения, но лично я бы делегировал этот тип проверки на другую структуру (то есть [Проверка нокаута] (https://github.com/Knockout-Contrib/Knockout-Validation)) ... хотя я частично отношусь к этой комбинации, поскольку у меня есть опыт работы с ней. – Origineil
Нет, я бы предпочел придерживаться встроенной проверки SlickGrid. – jlarson
Я начал демонстрацию (http://jsfiddle.net/origineil/nLpzjL32/) полной проверки сетки. Кнопка 'validate' будет запускать любой столбец, определяемый' validator', против каждого ввода данных. * Поведение ошибки проверки по умолчанию * не позволяет закрыть поле ввода редактора, поэтому я добавил мигание ячейки, чтобы проиллюстрировать, где вам нужно будет выполнить требуемую обработку отказа. Во-вторых, я не знаю, что такое значение * default *, поэтому я использовал только числа с требованием, чтобы они были '> 0'. – Origineil