我正在使用knokcout.js和knockout.validation插件。我的代码中存在验证消息的问题。我在可观察字段(比如密码)上应用了2次验证,如:
在Js代码中
..
this.Password = ko.observable().extend({
required: { message: "Enter password" },
minLength: { params: 6, message: "Must be 6 chars long" }
});
..
在Html中
<input type="password" data-bind="value: Password, valueUpdate:'afterkeypress"
placeholder="Password" />
现在我的问题是,当我在密码字段中输入单个字符而不是显示验证消息(Must be 6 chars long)
时,它会显示消息(Enter password)
,而不是当我在字段中输入第二个字符时,它显示我消息(Must be 6 chars long)
。这种行为适用于我应用验证的所有字段。有人可以告诉我问题在哪里吗?
答案 0 :(得分:1)
代码似乎是对'keypress'而不是'afterkeypress'作出反应。您在示例html中的'afterkeypress'之后缺少单引号。
文档并没有真正将'afterkeypress'列为updateValue选项,但它确实在我的测试中有效。
From documentation for value binding
如果你的绑定还包含一个名为valueUpdate的参数,那么这个 定义KO应该用来检测更改的其他浏览器事件 除了改变事件。以下字符串值最多 通常有用的选择:
- “keyup” - 在用户释放密钥时更新您的视图模型
- “keypress” - 在用户键入密钥时更新您的视图模型。与keyup不同,这会在用户按住键时重复更新
- “afterkeydown” - 用户开始输入字符后立即更新您的视图模型。这可以通过捕获浏览器的keydown事件来实现 并异步处理事件。
在这些选项中,如果您愿意,“afterkeydown”是最佳选择 保持您的视图模型实时更新。
该文件建议使用'afterkeydown'选项以获得最佳效果,我发现情况确实如此。
我创建了一个使用'keypress','afterkeypress'和'afterkeydown'的示例。
请参阅:http://jsbin.com/anerop/3/edit(validatedObservable;注意:单击“使用js运行”按钮)
绑定到'afterkeydown'似乎提供了最佳的用户体验。在控件失去焦点之前,'afterkeypress'不会更新。
示例数据绑定:
<input type="password" data-bind="value: Password, valueUpdate:'afterkeydown'"
placeholder="Password" />
我创建了另一个没有使用validatedObservable并获得类似结果的示例。
请参阅:http://jsbin.com/itatic/1/edit(not validatedObservable;注意:单击“使用js运行”按钮)