嵌套视图模型的Knockout验证

时间:2015-06-03 13:17:33

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

我希望结合使用KnockoutJS图书馆,Knockout.Mapping插件和Knockout-Validation插件来显示用户可以操作的一些数据。

我的数据作为AJAX调用的嵌套对象而来,我通过映射插件运行该数据来创建Knockout视图模型,使用ko.mapping.fromJS中的映射选项对象自定义验证规则。 / p>

我成功地在第一层获取对象(下面的小提琴中的名称),如果该字段为空则显示消息,但是嵌套的对象(IntroData.PlanName)不显示验证消息。我是否需要为这些嵌套对象设置不同的映射对象?

ViewModel(我的AJAX调用中的内容示例):

var stuff = {
    IntroData: {
        PlanName: 'Test'
    },
    name: 'tes2s3t'
};

映射:

var validationMapping = {
    IntroData: {
        PlanName: {
            create: function (options) {
                return ko.observable(options.data).extend({
                    required: true
                });
            }
        }
    },
    name: {
        create: function (options) {
            return ko.observable(options.data).extend({
                required: true
            });
        }
    }
};

联播:

ko.validation.init({
    registerExtenders: true,
    messagesOnModified: true,
    insertMessages: true,
    parseInputAttributes: true,
    messageTemplate: null,
    grouping: {
        deep: true
    }
}, true);

window.viewModel = ko.validatedObservable(ko.mapping.fromJS(stuff, validationMapping));

ko.applyBindings(window.viewModel);

小提琴:http://jsfiddle.net/odxv53g9/5/

谢谢!

1 个答案:

答案 0 :(得分:0)

文档不清楚,但显然ko.mapping.fromJS()忽略了嵌套映射,因此PlanName的“create”方法永远不会被调用。

您可以为IntroData添加显式映射:

IntroData: {
    create: function (options) {
        var nestedMapping = {
            PlanName: {
                create: function (options) {
                    return ko.observable(options.data).extend({
                        required: true
                    });
                }
            }
        }

        return ko.mapping.fromJS(options.data, nestedMapping);
    }        
}

这是一个工作小提琴:http://jsfiddle.net/odxv53g9/6/