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)
Я не уверен, почему это работает, у меня не было времени копаться в деталях вызовов различных методов, но это работает. Так что, если у кого-то еще есть эта проблема, вы идете!