Knockout Validation validatedОшибка группы Observable

У меня есть группа элементов, которые мне нужно проверить в целом. Я устанавливаю validatedObservable в группе, но сообщение об ошибке не отображается.

У меня есть упрощенный пример здесь. Я хочу, чтобы каждое число находилось в диапазоне от 0 до 100, а сумма равнялась ровно 100. Как мне справиться с такой проверкой?

Обновление: я знаю, что в этом примере я мог бы просто сделать ko.computed и проверить это, но это не то, что мне нужно.

Пример: http://jsfiddle.net/CGuW2/5/

0-100:<input data-bind="value: num1, valueUpdate: 'afterkeydown'"/><br>
0-100:<input data-bind="value: num2, valueUpdate: 'afterkeydown'"/><br>
<span class="validationMessage" data-bind='text: isValidSum.errors()'></span>

ko.validation.rules['mustEqual'] = {
    validator: function (val, otherVal) {
        return (parseInt(val.num1()) + parseInt(val.num2())) == otherVal;
    },
    message: 'total must equal {0}'
};
ko.validation.registerExtenders();

var viewModel = {
    num1: ko.observable("50").extend({ number: true, min: 0, max: 100 }),
    num2: ko.observable("50").extend({ number: true, min: 0, max: 100 })
};

viewModel.isValidSum = ko.validatedObservable({
                            num1: viewModel.num1,
                            num2: viewModel.num2
                        }).extend({ mustEqual: 100 });

ko.applyBindings(viewModel);

person Homer    schedule 13.11.2012    source источник
comment
В Chrome я вижу сообщение Пожалуйста, введите значение меньше или равное 100. Если я ввожу большие числа...   -  person nemesv    schedule 13.11.2012
comment
Эти сообщения об ошибках для каждого номера. Мне также нужно проверить группу. Каждое число должно быть в диапазоне от 0 до 100, а сумма должна равняться 100. Я обновил пример, потому что он был ошибочным.   -  person Homer    schedule 13.11.2012


Ответы (2)


Мне нужно было привязать text: isValidSum.error вместо text: isValidSum.errors(). Кроме того, похоже, что вам нужно привязать visible: !isValidSum.isValid(), когда вы это делаете.

Итак, мое решение выглядит так:

Пример: http://jsfiddle.net/CGuW2/6/

0-100:<input data-bind="value: num1, valueUpdate: 'afterkeydown'"/><br>
0-100:<input data-bind="value: num2, valueUpdate: 'afterkeydown'"/><br>
<span class="validationMessage" data-bind='visible: !isValidSum.isValid(), text: isValidSum.error'></span>
person Homer    schedule 14.11.2012
comment
похоже, что это работает, но я не думаю, что это так, как это должно быть сделано. github.com/ericmbarnard/Knockout-Validation/issues/41 и его пример показывает, что вы должны передать результат вызова validatedObservable в applyBindings в качестве вашей корневой виртуальной машины... но я не могу приступить к работе, см. github.com/ericmbarnard/Knockout-Validation/issues/202. У вас есть еще прозрения? - person Chris DaMour; 04.01.2013
comment
У меня было озарение. Все изменилось с тех пор, как я разместил здесь свой ответ (библиотечные версии), и решения, которые у меня были, больше не работают. Я отправил аналогичный вопрос здесь где я думаю, что у меня есть лучший ответ для библиотек, как они есть сегодня (ko 3.4, kv 2.0.3). - person Homer; 08.04.2016

Проверьте эту скрипку, я реализовал проверку суммы.
http://jsfiddle.net/CGuW2/3/
Думаю, проблема было то, что вы не можете использовать extend на validatedObservable

person Sergey Gavruk    schedule 13.11.2012