Проверка нокаута

У меня есть проект asp.net mvc3, в котором я выполняю массовое редактирование таблицы с привязкой к нокауту. Я хочу выполнять проверки, такие как обязательные и числовые проверки, при сохранении данных. Есть ли более простой способ сделать нокаут проверки. PS: я не использую формы.


person Kurkula    schedule 25.01.2012    source источник


Ответы (3)


Взгляните на Knockout-Validation, который четко настраивает и использует то, что описано в непроверенная документация. В разделе: Живой пример 1: принудительное числовое значение ввода

Вы можете увидеть это в Fiddle.

ОБНОВЛЕНИЕ: скрипт был обновлен для использования последней версии KO 2.0.3 и ko.validation 1.0.2 с использованием URL-адресов Cloudfare CDN.

Чтобы настроить ko.validation:

ko.validation.rules.pattern.message = 'Invalid.';

ko.validation.configure({
    registerExtenders: true,
    messagesOnModified: true,
    insertMessages: true,
    parseInputAttributes: true,
    messageTemplate: null
});

Для настройки правил проверки используйте расширители. Например:

var viewModel = {
    firstName: ko.observable().extend({ minLength: 2, maxLength: 10 }),
    lastName: ko.observable().extend({ required: true }),
    emailAddress: ko.observable().extend({  // custom message
        required: { message: 'Please supply your email address.' }
    })
};
person Cohen    schedule 05.03.2012
comment
Это я или скрипка сломана в IE9 и IE10? Хотя работает на Chrome и Firefox. - person Robert Koch; 01.10.2012
comment
@rob: IE9 дает мне; script был заблокирован из-за ошибки несоответствия типа mime. Вероятно, вы можете отключить эту проверку безопасности. - person Cohen; 02.10.2012
comment
@rob: Чтобы заставить его работать в IE, я удалил ресурсы и скопировал Knockout.validation в скрипку (уродливо, я знаю), однако это работает: jsfiddle.net/KHFn8/1369 - person Cohen; 02.10.2012
comment
Спасибо Коэн. Так что ТЕПЕРЬ я буду уверен, что он будет работать на моем сайте, даже если он уродлив на jsfiddle. :-) - person Robert Koch; 03.10.2012
comment
Вот рабочая версия оригинальной скрипки Эрика Барнарда, которая не такая уродливая. :) jsfiddle.net/alexdresko/KHFn8/2403 - person Alex Dresko; 03.03.2013
comment
Ссылки JS Fiddles на файлы Knockout через GitHub — и старые версии больше не размещаются. (Многие связанные примеры ссылаются на версию 2.1, а теперь они относятся к версии 2.2. Они также больше не содержат Knockout-latest.js). - person Overflew; 01.08.2013
comment
Knockout Validation теперь здесь - person crissdev; 21.11.2014

Если вы не хотите использовать библиотеку KnockoutValidation, вы можете написать свою собственную. Вот пример обязательного поля.

Добавьте класс javascript со всеми вашими расширениями или расширителями KO и добавьте следующее:

ko.extenders.required = function (target, overrideMessage) {
    //add some sub-observables to our observable
    target.hasError = ko.observable();
    target.validationMessage = ko.observable();

    //define a function to do validation
    function validate(newValue) {
    target.hasError(newValue ? false : true);
    target.validationMessage(newValue ? "" : overrideMessage || "This field is required");
    }

    //initial validation
    validate(target());

    //validate whenever the value changes
    target.subscribe(validate);

    //return the original observable
    return target;
};

Затем в вашем viewModel вы можете наблюдать:

self.dateOfPayment: ko.observable().extend({ required: "" }),

В Интернете есть несколько примеров такого стиля проверки.

person ChrisW    schedule 12.05.2015
comment
хорошо, но я получаю свою модель просмотра со стороны сервера через ajax и mvc razor и Knockout.mapping. Я также импортирую модули javaScript непосредственно с сервера, используя .net mvc, преобразования newton json и необработанные помощники html... Теперь... как я могу расширить свои наблюдаемые объекты, не применяя наблюдение за одним полем за раз. - person Clarence; 22.08.2017

Проверка Knockout.js удобна, но ненадежна. Вы всегда должны создавать реплику проверки на стороне сервера. В вашем случае (поскольку вы используете Knockout.js) вы отправляете данные JSON на сервер и обратно асинхронно, поэтому вы можете заставить пользователя думать, что он видит проверку на стороне клиента, но на самом деле это будет асинхронная проверка на стороне сервера.

Взгляните на пример здесь upida.cloudapp.net :8080/org.upida.example.knockout/order/create?clientId=1 Это ссылка «Создать заказ». Попробуйте нажать "сохранить" и поиграться с продуктами. Этот пример выполнен с использованием библиотеки upida (есть версия spring mvc и asp.net mvc этой библиотеки) из codeplex.

person user2626270    schedule 30.08.2013
comment
-1 Нокауту это не свойственно. ВСЕ JavaScript также необходимо ВСЕГДА проверять на сервере. Библиотека Knockout Validation проверяет клиентскую сторону. - person Mike; 29.04.2014
comment
Добавление дополнительных циклов для ping проверки на стороне сервера, я думаю, бесполезно, если в этом нет необходимости, когда на самом деле вы можете сначала проверить клиентскую сторону :), а затем убедиться через серверную сторону. Это факт, используете ли вы KO или любой другой фреймворк - person DropHit; 31.08.2014
comment
@SeanTorburn Согласен. Я даже не думал, что это настолько плохой ответ. Я мог видеть, что это работает довольно хорошо в некоторых сценариях. - person MPavlak; 11.05.2016