【问题标题】:How can I change knockout validation based on an event如何根据事件更改淘汰赛验证
【发布时间】:2013-09-06 00:52:09
【问题描述】:

我目前正在使用knockout validation 对表单进行验证:

html

<div>
    <span>Client</span><input type="text" data-bind="value:Client" />
</div>
<div>
    <span>IsMarried</span><input type="checkbox" data-bind="value:IsMarried" />
</div>
<div>
    <span>Spouse</span><input type="text" data-bind="value:Spouse" />
</div>

JS

function HouseHold() {
    var self = this;
    self.Client = ko.observable().extend({required:true});
    self.IsMarried = ko.observable();
    self.Spouse = ko.observable().extend({required:{ onlyIf:function(){ return self.IsMarried();}}});
}

目前,当 IsMarried 复选框被选中时,配偶字段在输入值然后被清除之前不会正确验证。

有什么方法可以根据事件修改我的淘汰视图模型上的绑定,或者使验证更快发生?

【问题讨论】:

    标签: knockout.js knockout-validation


    【解决方案1】:

    您可以使用 ko.validation.group 或 ko.validatedObservable,这使您能够检查错误并手动触发验证。

    这是解决此问题的一种方法:

    JS

    var HouseHold = function(){
        var self = this;
        self.Client = ko.observable().extend({required:true});
        self.IsMarried = ko.observable();
        self.Spouse = ko.observable().extend({required:{ onlyIf:function(){ return self.IsMarried();}}});
    }
    
    var houseHold = new HouseHold();  
    ko.validation.group(houseHold);          
    
    var forceValidation = function(){
        //is viewmodel valid?
        if(!houseHold.isValid())
        {
            //shows error messages for invalid properties
            houseHold.errors.showAllMessages();
        }
        //it looks like you need to return true else checkbox doesn't stay checked
        return true;
    }
    
    var vm = {
        houseHold: houseHold,
        forceValidation: forceValidation
    }
    
    ko.applyBindings(vm);
    

    HTML

    <div>
        <span>Client</span><input type="text" data-bind="value:houseHold.Client, valueUpdate: 'afterkeydown'" />
    </div>
    <div>
        <span>IsMarried</span><input type="checkbox" data-bind="checked:houseHold.IsMarried, click:forceValidation" />
    </div>
    <div>
        <span>Spouse</span><input type="text" data-bind="value:houseHold.Spouse, valueUpdate: 'afterkeydown'" />
    </div>
    

    Working jsfiddle sample.

    那么这段代码做了什么:

    • 开始验证 keydown 上的文本输入
    • 点击复选框触发验证

    【讨论】:

    • 请注意,forceValidation 函数需要返回 true 否则复选框 ui 会中断。
    • 没错,看起来您必须在绑定在复选框单击事件上的函数中返回 true,否则复选框不会保持选中状态。我更新了代码示例。
    猜你喜欢
    • 2013-09-10
    • 2022-10-17
    • 2012-02-18
    • 2013-11-14
    • 2011-08-09
    • 2015-02-28
    • 2015-02-01
    • 2014-04-28
    • 2012-11-04
    相关资源
    最近更新 更多