【发布时间】:2013-06-17 06:05:59
【问题描述】:
我有一个 SPA,我在其中使用 Durandal / KnockoutJS 和 knockout.validation.js。在 {view}.js 我有这个集合
ko.validation.configure ({
decorateElement: true,
registerExtenders: true,
messagesOnModified: true,
insertMessages: false,
messageTemplate: null,
parseInputAttributes: true,
});
在我的观点之一中
<input class="input-member"
type="text"
data-bind="value: memberno, validationOptions: { errorElementClass: 'input-validation-error' }"/>
当第一次激活视图时,元素正确地应用了 input-validation-error 样式。
在随后加载视图时,未按我的要求应用 css。我可以在 firebug 中看到输入字段现在应用了此类 input-member validationElement
我不知道 validationElement 是从哪里来的 - 但是淘汰赛绑定出了点问题。我已经尝试将验证配置移动到 shell.js 中,但结果是一样的(无论如何也不是一个好主意)。
编辑:
到目前为止,看起来 errorElementClass: 'input-validation-error' 在导航后没有被重新应用到元素。如果该字段是 modified-focused-cleared ,则验证正常触发。 validationElement 是 errorElementClass 的占位符
更新
在the github site 找到了这条信息,似乎是我所追求的
在 {view}.js 中
function activate() {
vm.memberno.isModified(false);
return true;
}
上面的代码似乎适用于输入字段,但不适用于选择字段。我正在考虑的另一个想法是添加一个像这样的绑定处理程序
ko.bindingHandlers.validationElement = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var valueIsValid = valueAccessor().isValid();
if (!valueIsValid) {
$(element).addClass("input-validation-error");
} else {
$(element).removeClass("input-validation-error");
}
}
}
适用于所有选择和输入,但始终处于打开状态。如果有办法在第一个表单提交触发之前停用此绑定,我认为可以做到。
【问题讨论】:
-
ko.validation.configu ... });在哪里调用?这是在初始化函数还是激活函数中?也许发布更多代码,这也可能有所帮助:[link]durandaljs.com/documentation/Hooking-Lifecycle-Callbacks -
什么会触发重新应用绑定?除非有一些事件或可观察到的变化,否则简单地导航回视图不会导致绑定更新。您可能想在视图模型的
activate函数中添加一些代码来强制验证。 -
感谢@LeroyMeijer,查看生命周期文档.. 看起来 viewAttached() 将成为候选对象
-
@CodingGorilla 说得通,而且可能让我离我最近,如果我遇到死胡同,我就把它标记出来
-
@MikeW 从您的帖子来看,您可能是对的,viweAttached() 就是您正在寻找的东西。请记住,如果您正在缓存视图,则需要在您的组合绑定上配置 alwaysAttachView:true。另一方面,我发现使用 jquery.validate 比使用 knockout.validation 更容易。如果您需要 jQuery 版本的自定义绑定和详细信息,请告诉我。
标签: durandal knockout-validation