我正在使用带有ie8验证和jquery 占位符插件的 knockout.js。淘汰赛绑定:
ko.bindingHandlers.placeholder = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
ko.applyBindingsToNode(element, { attr: { placeholder: valueAccessor() } });
$(element).placeholder();
$(element).focus();
$(element).blur();
}
}
用法:
<div>
<input type="text" data-bind="placeholder: 'Product name...', value: productName, valueUpdate: 'afterkeydown'" />
<span data-bind="visible: productName.isValid" class="validationMessageValid">Ok.</span>
<span data-bind="validationMessage: productName" class="validationMessage"></span>
</div>
在视图模型中:
...
self.productName = ko.observable('').extend({ required: { params: true, message: 'Name of the product cannot be empty.' } });
...
这是问题所在。清除文本输入时,插件正在设置占位符值。淘汰赛验证读取此值而不是空字符串,因此验证无法正常工作,由于占位符值,它会显示“OK”。
删除输入中的文本后,有两个验证检查,第一个是空字符串,第二个是占位符字符串。有趣的是 textarea 元素只有第一个元素,一切正常。
我的想法是检查值是否与占位符相同,如果将空字符串转发到验证中。Knockout 验证插件已经覆盖了默认的“value”绑定并将 valueAccessor 发送到另一个名为“validationCore”的绑定,我想做的是将这个条件插入到 valueAccessor 中。
也许有一个更简单的解决方案?欣赏任何想法。
knockout.js 2.3、jquery 1.10.2、占位符插件 2.0.7