在 Durandal 应用程序中,我有一个对话框,其中包含绑定到视图模型的视图。
每个输入元素的标签元素都包含一个用 icon-warning-sign 完成的警告字形。每个字形的可见性由数据绑定控制,如下所示:
<div class="form-group">
<label for="email">
Email <i class="icon-warning-sign orange"
data-bind="visible:Email.hasError, attr: { title:Email.validationMessage }"></i>
</label>
<input id="email" class="form-control" type="text"
data-bind="value: Email, valueUpdate: 'afterkeydown'" />
</div>
电子邮件是视图模型的可观察属性。hasError 属性是由扩展器创建的子可观察对象。其中有几个,这是一个示例。只有验证实现有所不同。
function prepForExtender(target) {
if (target.hasError) return;
target.hasError = ko.observable();
target.validationMessage = ko.observable();
}
ko.extenders.required = function (target, overrideMessage) {
prepForExtender(target);
//define a function to do validation
function validate(newValue) {
target.hasError(!newValue);
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;
};
这是扩展器的示例使用。
register.FirstName = ko.observable()
.extend({ required: "First name is missing" });
除 IE8 外,一切正常。请不要从花生画廊中嘲笑 IE8,它是客户的 SOE,仅此而已。在 IE8 中,当对话框打开时,警告字形不可见。如果您编辑输入的值,则字形的可见性会正确更新,因此绑定和逻辑可以正常工作。
首次显示对话框时如何触发评估?
更多信息:在转换到 hasError() == true 之前,字形不会变得可见。因此,如果页面以给定输入的 hasError true 开头,那么您必须使 hasError 返回 false 然后再次返回 true 以使字形可见。