4

我正在尝试弄清楚如何使用 knockoutjs 验证插件。查看 github 上的项目站点,有一个入门部分描述了如何设置具有验证的视图模型。在此示例中,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

但是,我想使用如下函数设置我的视图模型:

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

4

2 回答 2

3

ko.validatedObservable() 是 viewModel 验证的关键。它创建插件所需的所有内部方法(不止 isValid)。您仍然可以使用函数创建实例,但尝试将其包装在 ko.validatedObservable() 中:

var viewModelInstance = ko.validatedObservable( new MyViewModel() );
于 2013-07-30T21:21:24.547 回答
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 });
于 2014-06-16T11:52:33.730 回答