KnockoutJS:仅在绑定控件可见时validation模型的属性

我在一个绑定到几个控件的页面中有模型。 基于某些条件,这些控件中的一些将是可见的或不可见的。 在最后的提交中,我应该只validation那些可见的。

以下是解释我的要求的示例代码

 Age Required
Name :
Age:
var viewModel = { Name: ko.observable(), Age: ko.observable(),requireAge:ko.observable(false) }; ko.applyBindings(viewModel); function validateModel() { //validate visible properties and throw a common message that all visible fields should be filled }

我的建议是使用淘汰validation库(你在你的问题中没有提到它,所以我假设你还没有使用它)它与淘汰赛无缝结合,使validation更加方便。 我在过去的一年中广泛使用它,它让我的生活变得更加容易。 无需创建计算以跟踪observable是否包含有效值。 你可以在github上找到knockout-validation库。

在您的情况下,您可以简单地执行以下操作:

 var viewModel = function(){ var self = this; self.name = ko.observable(); self.requireAge = ko.observable(false); self.age = ko.observable().extend({ required: { onlyIf: function() { return self.requireAge(); } } }); }; 

validation错误消息会自动插入到observable绑定的元素下面。 您也可以创建自己的validation规则,但有很多可以直接使用,包括上面演示的那个。 您甚至可以为某些规则使用某些数据属性。 这可能是与淘汰赛一起进行validation的最佳方式。

基于某些条件,这些控件中的一些将是可见的或不可见的。

如果这些条件包含在模型中会更好。 和validation方法也一样。

请参阅代码段:

 var viewModel = function() { this.Name = ko.observable(""); this.Age = ko.observable(""); this.requireAge = ko.observable(false); this.isValid = ko.computed(function() { if (ko.unwrap(this.Name).length === 0) return false; if (ko.unwrap(this.requireAge) && ko.unwrap(this.Age).length === 0) return false; return true; }, this); }; window.onload = function() { ko.applyBindings(new viewModel()); }; 
  Age Required
Name :
Age:
is valid: