我在这个问题上看过一些类似的问题,但没有一个真的有帮助。我想先在此处发布此信息,然后在GitHub项目上打开验证插件的票证,以防这是PEBKAC问题。 :)
问题很简单。我有一个从JSON填充的对象,然后将验证附加到字段。问题是如果我使用映射插件,validationMessage绑定就会中断。但是,如果我明确声明每个observable,它工作正常。你可以看到一个小提琴here。这是非常明显的,只需在使用中断代码时检查控制台窗口,您就可以看到错误消息。
以下是代码的基本部分。首先,我的Knockout代码:
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>
我起初认为我对暴露模块模式的使用在某种程度上搞砸了,但是因为如果我明确地声明了每个可观察对象,它都有效,我把那个想法抛到了窗外。
我已经看到了一些关于创建验证映射的建议,例如this answer。如果我的模型只有几个字段,这样会很好,但是我的一些表单有100个以上的字段,所以尽管这可能有用,但这是不可行的。而实际上只需要声明每个可观察对象的代码就少了。
希望某人能够对修复程序有所了解,或者至少确认这是验证插件的错误,然后我可以前往GitHub项目并与创建者合作。感谢。
答案 0 :(得分:1)
是的,是的,我知道,你不应该回答你自己的问题,但是如果这是为了寻找其他人,这就是我为解决这个问题所做的。我最初用这个来映射我的JSON:
ko.mapping.fromJS(json);
我碰巧将此行更改为另一种映射方式,我在其他地方看到了(不完全确定我为什么要更改它,TBH),并且它开始工作了:
ko.mapping.fromJS(json, {}, itemToBind)
我不确定为什么会这样,我没有时间深入研究不同方法调用的细节,但这很有效。所以,如果其他人有这个问题,那就去吧!