我们试图通过覆盖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;
}
答案 0 :(得分:0)
经过一番尝试和错误,终于了解了您想要的是什么。我认为您误解了验证器规则的工作方式。
http://dojo.telerik.com/UHIhACOh
规则: checkPercentageMaxValue:函数(输入){
T
在自定义规则列表中列出的每个规则都在要验证的每个控件上运行。
因此,您当前的规则是先检查每个输入控件,然后再检查该类型的任何其他输入控件(假设它们符合批准的条件)。
因此,您要多次运行检查,如果一项通过,则您的规则会假设所有条件都通过了,前提是它符合真实条件,并且对于有错误的项目也是如此,这就是为什么您遇到当前问题的原因得到。显然,如果这是您想要的(同时检查多个项目),则需要将true / false值保留在变量中,以便它将返回该消息(但是此消息将仅显示在踢出的控件旁边)最初的验证/关注)
希望添加第二个控件将使您更清楚地了解正在发生的事情。
如您所见,第一次输入控件时,规则将运行两次,直到其中一个输入框显示为错误状态,然后规则才仅在其中一个控件处于无效状态时运行,如果您在第二个框中错误地输入了一个值,则您的规则会指出该值已成功退出且有效。
我添加了一个按钮,以便您可以根据提供的规则查看验证器是否认为其处于有效/无效状态。
如果不清楚,或者您需要更多信息,请告诉我,我将相应地更新答案。