Пользовательская проверка ввода на стороне клиента сетки кендо «проходит, но не проходит»

У меня есть список записей, отображаемых в сетке кендо, где я могу создавать новые записи в режиме реального времени. Требование состоит в том, чтобы каждая запись имела уникальное имя.

При добавлении новой записи у меня есть эта функция для перебора списка записей и проверки уникальности имени новой записи перед ее добавлением. Он является расширением kendo.ui.validator, добавляя к нему собственное правило. Функция:

    //...
uniquenamevalidation: function (input, params) {
                        var errorCount = 0;
                        //check for the rule attribute
                        if (input.filter("[data-val-uniquenamevalidation]").length && input.val()) {
                            var dataSource = $("#grid").data("kendoGrid").dataSource;
                            var data = dataSource.data();
                            //iterating through all grid elements' Names, and comparing to input
                            for (var i = 1; i < data.length; i++) {
                                if (input.val() == data[i].Name) {
                                    errorCount++; //if there are any matches, increase error count
                                }
                            }
                        }
                        console.log(errorCount == 0); 
                        return errorCount == 0;//returns TRUE if there are no matches, therefore input is unique
                    }

Когда входные данные недействительны, функция возвращает false и проверка должна завершиться неудачно, она завершается с ошибкой с правильным сообщением, как и ожидалось http://snag.gy/d5TZR.jpg

Проблема: когда ввод действителен, функция возвращает true и проверка должна пройти, появляется эта необъяснимая ошибка и не дает мне продолжать. http://snag.gy/syxds.jpg


person evictednoise    schedule 29.12.2014    source источник


Ответы (1)


Итак, что касается Telerik Demos, я заметил, что мне не хватает оператора «вернуть истину» в конце функции; Это должно выглядеть так

uniquenamevalidation: function (input, params) {
                    var errorCount = 0;
                    //check for the rule attribute
                    if (input.filter("[data-val-uniquenamevalidation]").length && input.val()) {
                        var dataSource = $("#grid").data("kendoGrid").dataSource;
                        var data = dataSource.data();

                        for (var i = 1; i < data.length; i++) {
                            if (input.val() == data[i].Name) {
                                errorCount++;
                            }
                        }
                        return errorCount == 0;
                    }
                    return true;
                }

Похоже, что для проверки каждого поля вызываются все правила и передается аргумент одного поля, которое затем фильтруется с помощью первого оператора if и правила, которые не обращают внимания на это поле, просто возвращают true.

Не уверен, насколько это правильно, но теперь он работает нормально, и это единственное логическое объяснение, которое я мог придумать.

person evictednoise    schedule 30.12.2014