Knockoutjs验证-重新计算验证规则

knockoutjs validation - recompute validation rules

本文关键字:验证 计算 规则 -重 新计算 Knockoutjs      更新时间:2023-09-26

我使用knockoutjs连同knockoutjs验证插件来验证我的视图模型。这是我的javascript代码

// enable validation
ko.validation.init();
// View model
function AppViewModel() {
    this.Canceled = ko.observable(false);
    this.Name = ko.observable("").extend({
        //custom validation
        validation: {
            validator: function (val, params) {
                //alert to show when validation is triggered
                alert("validation function was called");
                //change validation rule depending on whether cancel button was clicked
               if(params.Canceled == true)
                   return true;
                else
                   return false;
            },
            message: 'This field is required',
            params: {Canceled:this.Canceled()}
        }
    });

    this.errors = ko.validation.group(this);
    //function triggered on submit which checks for validation
    this.submit = function() {
        if(this.errors().length != 0)
            this.errors.showAllMessages();
        else
            alert("no errors detected");
    };
    //function to cancel validation rules
    this.cancelValidation = function() {
        this.Canceled(true);
    };
}
// Activate knockout.js
ko.applyBindings(new AppViewModel());​

这里是我的HTML

Name: <input type="text" data-bind="value: Name"/><br/><br/>
<button data-bind="click: submit">submit</button> <button data-bind="click: cancelValidation">Cancel validation</button>​

我想做的是在运行时更改验证规则,如果"取消验证"按钮被点击。为此,我使用了一个自定义验证函数和一个ko。可观察变量"Canceled"。根据"Canceled"的值,验证器函数返回true或false。我遇到的问题是,当页面加载时,验证函数只运行一次。当"Canceled"的值发生变化时,不会重新运行该函数。这是正常行为吗?当我更改"取消"的值时,是否有办法让我重新运行当前模型的验证函数?

这里是一个小提琴来尝试代码。我在验证函数中添加了一个警告,以显示它只在页面加载时运行一次。

http://jsfiddle.net/eewJe/

你应该把可观察对象而不是值传递给选项。把

if(params.Canceled == true)

if(params.Canceled() == true)

并传入可观察对象。把

params: {Canceled:this.Canceled()}

params: {Canceled:this.Canceled}

这是更新后的小提琴:http://jsfiddle.net/nEPNC/

没关系,我可以自己解决它。对于遇到这个问题的人,这里是我更新的Javascript

// enable validation
ko.validation.init();

// View model
function AppViewModel() {
    var self = this;
    this.Canceled = ko.observable(false);
    this.Name = ko.observable("").extend({
        //custom validation
        validation: {
            validator: function (val,para) {
                //alert to show when validation is triggered
                alert("validation function was called");
                //change validation rule depending on whether cancel button was clicked
               if(self.Canceled() == true)
                   return true;
                else
                   return false;
            },
            message: 'This field is required'
        }
    });

    this.errors = ko.validation.group(this);
    //function triggered on submit which checks for validation
    this.submit = function() {
        if(this.errors().length != 0)
            this.errors.showAllMessages();
        else
            alert("no errors detected");
    };
    //function to cancel validation rules
    this.cancelValidation = function() {
        this.Canceled(true);
    };
}
// Activate knockout.js
ko.applyBindings(new AppViewModel());​

我改变了我的验证器函数,直接检查self.Canceled()的值,而不是像我在使用验证器的"params:"属性之前所做的那样,将cancelled作为参数传递。现在一切正常。这是一个更新的小提琴

http://jsfiddle.net/HtYCw/

如果有人有更好的方法,我仍然对评论感兴趣。