Kendo数字文本框自定义百分比值验证

时间:2018-07-09 12:38:07

标签: kendonumerictextbox kendo-validator

我们试图通过覆盖Kendo数字文本框的默认行为来显示验证错误消息,以显示百分比值。

我们的期望是在用户键入任何大于100的值时提供自定义消息。

默认情况下,如果用户键入的内容超过100(我们不希望出现这种情况),那么Kendo NumericTextbox会自动更正百分比值

请找到相同的jsfiddle参考网址,以更好地理解它 https://jsfiddle.net/6uyp825h/57/

<!DOCTYPE html>
<html>
<head>
<base href="https://demos.telerik.com/kendo-ui/numerictextbox/index">
<style>html { font-size: 14px; font-family: Arial, Helvetica, sans-serif; }</style>
<title></title>
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2018.2.620/styles/kendo.common-material.min.css" />
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2018.2.620/styles/kendo.material.min.css" />
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2018.2.620/styles/kendo.material.mobile.min.css" />

<script src="https://kendo.cdn.telerik.com/2018.2.620/js/jquery.min.js"></script>
<script src="https://kendo.cdn.telerik.com/2018.2.620/js/kendo.all.min.js"></script>

</head>
<body>

    <div id="example">
        <div id="add-product" class="demo-section k-content">
            <p class="title">Add new product</p>
            <ul id="fieldlist">
                <li>
                    <label>
                        Price Discount:
                        <input id="percentage" value="5" title="percentage" style="width: 100%;" />
                    </label>
                </li>

            </ul>
        </div>


        <script>
            $(document).ready(function() {

                // create Percentage NumericTextBox from input HTML element
                $("#percentage").kendoNumericTextBox({
                    format: "##.00 \\%",
                    min: 0,
                    spinner: false
                });

    var container = root;
    kendo.init(container);

    container.kendoValidator({
        rules: {
            checkPercentageMaxValue: function (input) {

               var maxAllowedValue = 100;
               var currentValue = parseInt($("#percentage").val());
                        if (currentValue > maxAllowedValue)
                        {
                            return false;
                        }
                        else {
                            return true;
                        }
                    return true;
            }
        },
        messages: {

            checkPercentageMaxValue: "Percentage value cannot be greater than 100."
        }
    });


            });
        </script>

        <style>
            .demo-section {
                padding: 0;
            }

            #add-product .title {
                font-size: 16px;
                color: #fff;
                background-color: #1e88e5;
                padding: 20px 30px;
                margin: 0;
           }

           #fieldlist {
               margin: 0 0 -1.5em;
               padding: 30px;
           }

           #fieldlist li {
               list-style: none;
               padding-bottom: 1.5em;
           }

           #fieldlist label {
               display: block;
               padding-bottom: .6em;
               font-weight: bold;
               text-transform: uppercase;
               font-size: 12px;
           }

           #fieldlist label .k-numerictextbox {
               font-size: 14px;
           }
        </style>

    </div>

这是我在实际情况下获得的html

<div class="col-sm-8">
        <span class="k-widget k-numerictextbox single-line text-box form-control">
            <span class="k-numeric-wrap k-state-default k-expand-padding">
                <input tabindex="0" title="112.00 %" class="k-formatted-value single-line text-box form-control k-input k-valid" role="spinbutton" aria-disabled="false" aria-valuenow="112" style="display: inline-block;" type="text">
                <input name="PercentHeld3" class="single-line text-box form-control k-input k-valid" id="PercentHeld3" role="spinbutton" aria-disabled="false" aria-valuenow="112" style="display: none; border-color:black; " type="text" maxlength="16" data-role="numerictextbox" data-bind="value: PercentHeld" data-spinners="false" data-numberformat="percentage" data-decimals="2" data-validate="true" data-maxallowedvalue="100" data-max-msg="Percentage value cannot be greater than 100.">
                <span class="k-select" style="display: none;">
                    <span title="Increase value" class="k-link k-link-increase" style="touch-action: none;" aria-label="Increase value" unselectable="on">
                        <span class="k-icon k-i-arrow-60-up" unselectable="on"></span>
                    </span>
                    <span title="Decrease value" class="k-link k-link-decrease" style="touch-action: none;" aria-label="Decrease value" unselectable="on">
                        <span class="k-icon k-i-arrow-60-down" unselectable="on"></span>
                    </span>
                </span>
            </span>
        </span>
    </div>

真实场景中使用的规则

checkPercentageMaxValue: function (input) {
                $('input[data-maxallowedvalue][data-validate="true"]').each(function (index, item) {
                    var maxAllowedValue = parseInt($(item).attr('data-maxallowedvalue'));
                    var currentValue = parseInt($(item).val().replace(/%?$/, ''));
                    if (currentValue > maxAllowedValue) {
                        return false;
                    }
                    else {
                        return true;
                    }
                });
                return true;
            }

1 个答案:

答案 0 :(得分:0)

经过一番尝试和错误,终于了解了您想要的是什么。我认为您误解了验证器规则的工作方式。

http://dojo.telerik.com/UHIhACOh

规则:  checkPercentageMaxValue:函数(输入){

T

在自定义规则列表中列出的每个规则都在要验证的每个控件上运行。

因此,您当前的规则是先检查每个输入控件,然后再检查该类型的任何其他输入控件(假设它们符合批准的条件)。

因此,您要多次运行检查,如果一项通过,则您的规则会假设所有条件都通过了,前提是它符合真实条件,并且对于有错误的项目也是如此,这就是为什么您遇到当前问题的原因得到。显然,如果这是您想要的(同时检查多个项目),则需要将true / false值保留在变量中,以便它将返回该消息(但是此消息将仅显示在踢出的控件旁边)最初的验证/关注)

希望添加第二个控件将使您更清楚地了解正在发生的事情。

如您所见,第一次输入控件时,规则将运行两次,直到其中一个输入框显示为错误状态,然后规则才仅在其中一个控件处于无效状态时运行,如果您在第二个框中错误地输入了一个值,则您的规则会指出该值已成功退出且有效。

我添加了一个按钮,以便您可以根据提供的规则查看验证器是否认为其处于有效/无效状态。

如果不清楚,或者您需要更多信息,请告诉我,我将相应地更新答案。