javascript - 单击按钮时调用 knockout 验证扩展器

标签 javascript validation knockout.js

我读过很多问题,询问如何在按钮单击事件上调用 knockout 验证扩展程序。但所有接近回答问题的答案都涉及使用 knockout 验证库的解决方法。我没有使用 knockout 验证库。我想做的就是使用 knockout 扩展器中定义的验证规则来验证按钮单击事件上的输入字段。

为了简单起见,我将使用 knockout documentation 中所需的扩展器并将其应用到一个简单的用例中。此用例接受输入,并在按钮单击事件上对用户输入的值执行某些操作。或者如果未输入值,则更新 View 以显示验证消息。

knockout 码:

ko.extenders.required = function (target, overrideMessage) {
    target.hasError = ko.observable();
    target.validationMessage = ko.observable();

    function validate(value) {
        target.hasError(value ? false : true);
        target.validationMessage(value ? "" : overrideMessage || 'Value required');
    }

    return target;
};

function MyViewModel() {
    self = this;
    self.userInput = ko.observable().extend({ required: 'Please enter a value' });

    /**
     * Event handler for the button click event
     */
    self.processInput = function () {
        //Validate input field
        //How to call the validate function in the required extender?

        //If passes validation, do something with the input value
        doSomething(self.userInput());
    };
}

标记:

<input type="text" data-bind="value: userInput, valueUpdate: 'afterkeydown'" />
<span data-bind="visible: userInput .hasError, text: userInput .validationMessage" class="text-red"></span>
<button data-bind="click: processInput ">Do Something</button>

如何触发按钮点击事件的验证并在未通过验证时显示验证消息?

最佳答案

我相信您正在查看此处的示例 - http://knockoutjs.com/documentation/extenders.html

您不能直接调用验证,但订阅会监视值并在更改时运行验证函数并更新您可以检查的可观察值 - hasError。

ko.extenders.required = function (target, overrideMessage) {
    target.hasError = ko.observable();
    target.validationMessage = ko.observable();

    function validate(value) {
        target.hasError(value ? false : true);
        target.validationMessage(value ? "" : overrideMessage || 'Value required');
    }
    
    //initial validation
    validate(target());
 
    //validate whenever the value changes
    target.subscribe(validate);
 
    //return the original observable
    return target;
};

function MyViewModel() {
    self = this;
    self.userInput = ko.observable().extend({ required: 'Please enter a value' });

    /**
     * Event handler for the button click event
     */
    self.processInput = function () {
        if(self.userInput.hasError()){
          console.log('has error');
        }else{
          console.log('no error');
        }
    };
}

// Activates knockout.js
ko.applyBindings(new MyViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type="text" data-bind="value: userInput, valueUpdate: 'afterkeydown'" />
<span data-bind="visible: userInput .hasError, text: userInput .validationMessage" class="text-red"></span>
<button data-bind="click: processInput ">Do Something</button>

关于javascript - 单击按钮时调用 knockout 验证扩展器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38832785/

相关文章:

javascript - Illustrator ExtendScript save() 方法

javascript - es6 模块如何导入自身?

knockout.js - 如何防止在执行 knockout 绑定(bind)之前显示 Html

forms - angular - 在指令中的表单元素之间动态更改验证要求

android - 编辑文本验证

asp.net-mvc - 如何对 MVC 传递的每个项目列表的属性应用 knockout 验证?

javascript - 动画 knockout 模板 View

javascript - 如何在函数中的 React Native 中迭代数组并在 render() 方法中使用它。必须返回有效的 React 元素(或 null)。

javascript - 无需滚动的 Wordpress Jquery 动画

html - 这个极简主义的 HTML5 标记有效吗?