敲除验证可以扩展validateObservable以验证整个模型吗?

时间:2013-01-04 00:11:02

标签: validation mvvm knockout.js knockout-validation

我正在将Knockout用于绑定到ViewModel的View,它具有一定的深度/复杂度。

要验证我的ViewModel,我需要在整个VM树中进行计算(步行和比较后代)。我希望利用淘汰验证插件@ https://github.com/ericmbarnard/Knockout-Validation创建一些任意的自定义验证规则并报告任何错误。

我使用KO计算的可观察@ http://jsfiddle.net/drdamour/ZrVZ7/设置了一种可能的方法。验证规则是确保没有2个SubCollections具有相同的值。这是有效的,但它没有使用Knockout-Validation,我的规则现在在我的计算observable中实现,这似乎是错误的。

我的问题与Knockout Validation validatedObservable group error非常相似,但我发现发现的解决方案(托管在http://jsfiddle.net/CGuW2/6/)不太理想:

var viewModel = {
    num1: ko.observable("50").extend({ number: true, min: 0, max: 100 }),
    num2: ko.observable("50").extend({ number: true, min: 0, max: 100 })
};

viewModel.isValidSum = ko.validatedObservable({
                            num1: viewModel.num1,
                            num2: viewModel.num2
                        }).extend({ mustEqual: 100 });

ko.applyBindings(viewModel);

因为它通过将已验证的self作为属性添加到自身(isValidSum)来复制ViewModel。我试图消除这种冗余@ http://jsfiddle.net/drdamour/5B8s4/,但视图无法绑定到validatedObservable:

var viewModel = {
    num1: ko.observable("50").extend({ number: true, min: 0, max: 100 }),
    num2: ko.observable("50").extend({ number: true, min: 0, max: 100 })
};

var vm = ko.validatedObservable(viewModel).extend({ mustEqual: 101 });

ko.applyBindings(vm);

这可能是KO或KO-Validation的错误,或者我可能只是完全错误。

所以问题是:什么是淘汰赛的最佳方式,以确定VM是否有效对抗评估多个属性的条件& VM的各个层面?

1 个答案:

答案 0 :(得分:4)

我通过grouping我希望在模型上验证的可观测量来采用不同的方法来验证我的模型,从而避免使用这种方法:

这是用于设置我的舞台的一些初始化代码(您可以查看所有可用选项Here

    ko.validation.init({
        registerExtenders: true,
        parseInputAttributes: true,
        grouping: { deep: true, observable: false }
    });

然后我会像你这样设置你的模型:

function testModel() {
    var self = this;
    self.num1 = ko.observable(100).extend({ number: true, min: 0, max: 100 });
    self.num2 = ko.observable(50).extend({ number: true, min: 0, max: 100 });

    self.sum = ko.observable(150).extend({ number: true, equal: 100 });
    self.num1.subscribe(function () {
        self.sum(self.num1() + self.num2());
    });
    self.num2.subscribe(function () {
        self.sum(self.num1() + self.num2());
    });

    self.errors = ko.validation.group(this);
}

var viewModel = new ViewModel();

//somewhere later where we are testing the model
if (viewModel.sum.isValid())
    //YAY!!!
else
   //this will update the UI as you have configured it to show the error messages
   viewModel.errors.showAllMessages(); 

使用ko.validation.group(model)将导致验证遍历模型中的所有可观察对象(有多深,取决于初始设置,你会注意到我做了grouping: { deep: true }这意味着是否有子模型w /这个模型中的observable也可以验证它们。

如果您想隔离不同的验证案例,您不仅可以对整个模型执行此操作,还可以对其中的一部分执行此操作。

修改

这是一种满足您的要求的方法。根据条件订阅要验证的所有可观察对象并不理想,但您唯一的选择是将它们分组为validatedObservable,这意味着您的数据最可能是首选结构。