【发布时间】:2014-12-09 02:15:40
【问题描述】:
我正在尝试使用 Knockout 实现验证,并尝试了来自 here 的“Bob”示例
<p data-bind="css: { error: firstName.hasError }">
<input data-bind='value: firstName, valueUpdate: "afterkeydown"' />
<span data-bind='visible: firstName.hasError, text: firstName.validationMessage'> </span>
</p>
<p data-bind="css: { error: lastName.hasError }">
<input data-bind='value: lastName, valueUpdate: "afterkeydown"' />
<span data-bind='visible: lastName.hasError, text: lastName.validationMessage'> </span>
</p>
源码:查看模型
ko.extenders.required = function(target, overrideMessage) {
//add some sub-observables to our observable
target.hasError = ko.observable();
target.validationMessage = ko.observable();
//define a function to do validation
function validate(newValue) {
target.hasError(newValue ? false : true);
target.validationMessage(newValue ? "" : overrideMessage || "This field is required");
}
//initial validation
validate(target());
//validate whenever the value changes
target.subscribe(validate);
//return the original observable
return target;
};
function AppViewModel(first, last) {
this.firstName = ko.observable(first).extend({ required: "Please enter a first name" });
this.lastName = ko.observable(last).extend({ required: "" });
}
ko.applyBindings(new AppViewModel("Bob","Smith"));
CSS:
.validationError{
border:solid 1px red;
}
在初始页面加载时,文本框中不会有任何数据。所以我删除了硬编码的名称。 现在验证消息在页面加载时显示,而不是在用户离开文本框时显示。 KO 在页面加载期间以某种方式认为文本框值已更改并触发验证代码。
如何阻止这种情况发生?
这是我尝试尝试的用例。 我有两个文本框,一个需要显示没有消息的红色边框,另一个需要显示验证消息。
谢谢。
【问题讨论】:
-
如果您使用链接页面中的
ko.extenders.required,只需删除行//initial validation validate(target());行以禁用初始验证 -
@nemesv 这会删除初始验证,但现在即使用户离开文本框,验证也不会触发。
-
你可以为它创建一个 jsfiddle 吗?
-
请不要在没有将代码添加到问题中的情况下要求/添加小提琴,否则问题取决于异地链接(可能会腐烂)。
-
您还需要使用
notify: 'always'扩展器,因为否则当模糊事件触发时,剔除不会触发可观察对象的更改事件,因为没有 chagne,因此您的验证器不会触发`@ 987654323@