我试图找出如何使用knockoutjs验证插件。查看github上的项目站点,有一个getting started section描述了如何使用验证设置视图模型。在这个例子中,ViewModel被声明为内联对象(这是正确的术语吗?),如下所示:
var myViewModel = ko.validatedObservable({
property1: ko.observable().extend({ required: true }),
property2: ko.observable().extend({ max: 10 })
});
console.log(myViewModel.isValid()); //false
myViewModel().property1('something');
myViewModel().property2(9);
console.log(myViewModel.isValid()); //true
但是,我想使用如下函数设置我的viewmodel:
function MyViewModel() {
var self = this;
self.property1 = ko.observable().extend({ required: true });
self.property2 = ko.observable().extend({ max: 10 });
};
var viewModelInstance = new MyViewModel();
console.log(viewModelInstance.isValid()); //false
viewModelInstance.property1('something');
viewModelInstance.property2(9);
console.log(viewModelInstance.isValid()); //true
问题是我收到一条脚本错误,指出我的viewModelInstance
对象没有方法isValid
。
答案 0 :(得分:3)
ko.validatedObservable()是验证viewModel的关键。它创建了插件所需的所有内部方法(不仅仅是isValid)。您仍然可以使用函数创建实例,但尝试将其包装在ko.validatedObservable()中:
var viewModelInstance = ko.validatedObservable( new MyViewModel() );
答案 1 :(得分:1)
这是源代码中的定义,也是knockout.validation.js
源中唯一使用的定义。
validatedObservable(
)就是这个 - 而这一点。
ko.validatedObservable = function (initialValue)
{
if (!kv.utils.isObject(initialValue)) { return ko.observable(initialValue).extend({ validatable: true }); }
var obsv = ko.observable(initialValue);
obsv.errors = kv.group(initialValue);
obsv.isValid = ko.observable(initialValue.isValid());
obsv.errors.subscribe(function (errors) {
obsv.isValid(errors.length === 0);
});
debugger;
return obsv;
};
根据我的经验,它比它的价值更麻烦 - 例如它没有选择指定深度'对于'组'这是创造的,我认为它真的只适用于简单的单一级别' js对象。
如果你有一个复杂的模型,你最好只做这样的事情并创建一个你真正想要验证的对象数组:
var validatables = [];
// if credit card is payment then validate payment details + address
if (this.paymentMethod() == "Credit Card")
{
validatables.push(this.paymentDetails);
validatables.push(this.billingAddress);
if (this.shipToBillingAddress() == false)
{
validatables.push(this.shippingAddress);
}
}
var group = ko.validation.group(validatables, { deep: true });