Knockout Validation - При использовании плагина сопоставления разрывается привязка сообщений валидации

Я видел несколько похожих вопросов на эту тему, но ни один из них не помог. Я хотел опубликовать это здесь, прежде чем открывать заявку на проект GitHub для плагина проверки на случай, если это проблема PEBKAC.:)

Вопрос прост. У меня есть объект, который я заполняю из JSON, а затем присоединяю проверку к полям. Проблема заключается в том, что если я использую подключаемый модуль сопоставления, привязка validationMessage обрывается. Однако, если я явно объявляю все наблюдаемые, это работает нормально. Вы можете увидеть скрипку здесь. Это довольно очевидно, просто проверьте окно консоли при использовании взломанного кода, и вы увидите сообщение об ошибке.

Вот основные биты кода. Во-первых, мой код нокаута:

var data = {
    Name: 'test'
};

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

var ns = ns || {}; // namespace

ns.ViewModel = function () {
    var itemToBind = {},
        init = function (json) {
            // Uncomment to break;
            itemToBind = ko.mapping.fromJS(json, {}, itemToBind);

            // Uncomment to make it work
            //itemToBind.Name = ko.observable(json.Name);

            itemToBind.Name.extend({ required: { message: 'Required' } });
        };

    return {
        itemToBind: itemToBind,
        init: init
    };
}();

ns.ViewModel.init(data);
ko.applyBindings(ns.ViewModel);

А потом мой HTML:

<label>Name: </label>
<input type="text" data-bind="value: itemToBind.Name" />
<div class="validation-section">
    <strong>*</strong>
    <span data-bind="validationMessage: itemToBind.Name"></span>
</div>

Сначала я подумал, что мое использование шаблона раскрывающего модуля как-то облажалось, но, поскольку все работает, если я явно объявляю каждую наблюдаемую, я выбросил эту мысль в окно.

Я видел некоторые предложения, такие как этот ответ о создании сопоставления проверки. Это было бы хорошо, если бы в моих моделях было всего несколько полей, но некоторые из моих форм имели более 100 полей, поэтому, хотя это может сработать, это невозможно. И на самом деле было бы меньше кода, чтобы просто объявить каждую наблюдаемую.

Надеясь, что кто-то может пролить некоторый свет на исправление или, по крайней мере, подтвердить, что это ошибка в плагине проверки, а затем я могу перейти к проекту GitHub и поработать с создателем. Благодарю.

1 ответ

Да, да, я знаю, вы не должны отвечать на свой вопрос, но в случае, если это возникнет в поиске кого-то другого, это то, что я сделал, чтобы исправить это. У меня изначально было это для сопоставления моего JSON:

ko.mapping.fromJS(json);

Мне пришлось изменить эту строку на другой способ отображения, который я видел где-то еще (не совсем уверен, почему я изменил ее, TBH), и она начала работать:

ko.mapping.fromJS(json, {}, itemToBind)

Я не уверен, почему это работает, у меня не было времени копаться в деталях вызовов различных методов, но это работает. Так что, если у кого-то еще есть эта проблема, вы идете!

Другие вопросы по тегам