Validation 敲除验证能否将validateObservable扩展到针对整个模型的验证?

Validation 敲除验证能否将validateObservable扩展到针对整个模型的验证?,validation,mvvm,knockout.js,knockout-validation,Validation,Mvvm,Knockout.js,Knockout Validation,我对绑定到ViewModel的视图使用Knockout,该视图具有一定的深度/复杂性 要验证ViewModel,我需要跨整个VM树进行计算(遍历和比较子体)。我希望利用knockout validation plugin@创建一些任意的自定义验证规则并报告任何错误 我建立了一种可能的方法,使用KO计算的可观测数据。验证规则是确保没有2个子集合具有相同的值。这是可行的,但它没有使用敲除验证,我的规则现在在我的计算可观察中实现,这似乎是错误的 我的问题与非常类似,但我发现发现的解决方案(托管于)不太

我对绑定到ViewModel的视图使用Knockout,该视图具有一定的深度/复杂性

要验证ViewModel,我需要跨整个VM树进行计算(遍历和比较子体)。我希望利用knockout validation plugin@创建一些任意的自定义验证规则并报告任何错误

我建立了一种可能的方法,使用KO计算的可观测数据。验证规则是确保没有2个子集合具有相同的值。这是可行的,但它没有使用敲除验证,我的规则现在在我的计算可观察中实现,这似乎是错误的

我的问题与非常类似,但我发现发现的解决方案(托管于)不太理想:

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。我试图消除此冗余@,但视图无法绑定到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验证的错误,也可能是我做的完全错误


因此,问题是:在淘汰赛中,确定虚拟机是否在跨虚拟机的多个属性和层进行评估的条件下有效的最佳方法是什么?

我通过对我要在模型上验证的观察值进行分组,采取不同的方法来验证我的模型,从而避免了这种情况:

这是一些用于设置my stage的初始化代码(您可以查看所有可用选项:

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

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/观察值,它也会验证这些

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

编辑:


这里有一种方法可以满足您的需求,它确实有效。订阅您想要根据某个条件验证的所有观察值并不理想,但您唯一的选择是将它们简单地分组到一个validatedObservable中,这意味着最有可能是您的数据的首选结构。

我避免这辆马车绕圈而行g通过
分组
我想在模型上验证的观察值,验证我的模型的不同方法:

这是一些用于设置my stage的初始化代码(您可以查看所有可用选项:

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

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/观察值,它也会验证这些

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

编辑:


这里有一种方法可以满足您的需求,它确实有效。订阅您想要根据条件验证的所有观察值并不理想,但您唯一的选择是将它们简单地分组到一个validatedObservable中,这意味着您的数据最有可能是首选结构。

此示例没有进行最重要的导入ant部分,即验证两个数字的总和是否为100。我想我可以在计算中进行检查。但现在我不使用KO验证,这是我想要使用的,因为我已经在我的真实场景中定义了相关规则。还可以检查我的等效computedObservable答案,它正是这样做的,但我对此不满意最后,validatedObservable应该只是group()的包装器这包括isValidI,事实上,它忽略了最重要的要求。我更新了我的答案,以展示一种可以处理您的场景的方法。这不是性感的速记代码,但不幸的是,这是我觉得缺少淘汰验证的一个方面…根据特定条件验证可验证的组。所以您没有太多这里有很多选项。validatedObservable是我想要的,但它似乎不起作用。这个示例没有做最重要的部分,即验证两个数字的总和是否为100。我想我可以在计算中进行检查。但是现在我不使用我想要使用的KO验证,因为我已经在我的r中为其定义了规则eal场景。还要检查我的等效computedObservable答案,它就是这样做的,但我不满意这个答案(请参见问题)。最后,validatedObservable应该只是组()的包装器这包括isValidI,事实上,它忽略了最重要的要求。我更新了我的答案,以展示一种可以处理您的场景的方法。这不是性感的速记代码,但不幸的是,这是我觉得缺少淘汰验证的一个方面…根据特定条件验证可验证的组。所以您没有太多这里有很多选项。validatedObservable是我想要的,但它似乎不起作用。