Knockout验证 - 使用映射插件时验证消息绑定中断

时间:2014-02-13 16:18:18

标签: knockout.js knockout-mapping-plugin knockout-validation

我在这个问题上看过一些类似的问题,但没有一个真的有帮助。我想先在此处发布此信息,然后在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项目并与创建者合作。感谢。

1 个答案:

答案 0 :(得分:1)

是的,是的,我知道,你不应该回答你自己的问题,但是如果这是为了寻找其他人,这就是我为解决这个问题所做的。我最初用这个来映射我的JSON:

ko.mapping.fromJS(json);

我碰巧将此行更改为另一种映射方式,我在其他地方看到了(不完全确定我为什么要更改它,TBH),并且它开始工作了:

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

我不确定为什么会这样,我没有时间深入研究不同方法调用的细节,但这很有效。所以,如果其他人有这个问题,那就去吧!