【问题标题】:Knockout bindings getting lost in Durandal app淘汰赛绑定在 Durandal 应用程序中丢失
【发布时间】: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


【解决方案1】:

需要有一种方法来重新应用绑定或导致绑定更新。尝试在视图模型的 activate 函数中添加一些代码来强制验证。

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 2013-04-09
    • 2014-04-11
    • 2014-01-17
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多