【问题标题】:durandal with ko.validation.init带有 ko.validation.init 的 durandal
【发布时间】:2013-06-06 20:30:04
【问题描述】:

所以,这是我这几天一直面临的问题。

我有一个 durandal 应用程序,我想在控件上应用 ko 验证。现在,验证确实得到应用,但问题是它在第一次加载时不会生效。例如如果我有一个需要设置为 true 的文本框并且在加载时,此文本框为空,KO 不显示所需的消息。

如果我在文本框中输入内容,然后移出文本框,再次进入文本框,删除数据,然后再次移出文本框,它只会显示消息。

我什至尝试在 div 标签内的 HTML 中添加 ko.validation.init({messagesOnModified: false}) 和验证选项。

但没有影响。

下面是我的代码

define(function (require) {
 ko.validation.init({
    messagesOnModified: false        
});
var duration = ko.observable().extend({
    required: { message: 'Please enter valid number.' }, number: true
});
var email = ko.observable().extend({ email: true, required: true });

var vm = {
    duration: duration,
    email: email

};
vm["errors"] = ko.validation.group(vm);
return vm;
});

HTML 代码

            <span data-bind="text: errors().length"></span> Errors

            <div>
                <label for="txtDuration">Duration</label>
                <input name="txtDuration" type="text" data-bind="value: duration" />
                <span>(Min)</span>
            </div>
            <div>
                <label for="txtEmail">Email</label>
                <input name="txtEmail" type="text" data-bind="value: email" />
            </div>
            <input type="submit" value="Submit" data-bind="enable: isValid()">

    </form>

请帮忙。

【问题讨论】:

  • 我还尝试了对 Fiddle 的淘汰赛验证,它也有同样的问题。 jsfiddle.net/sachinohri/U3QZU 这也有同样的问题,即在初始加载文本框时不显示所需的消息(文本框默认为空)

标签: knockout.js durandal knockout-validation


【解决方案1】:

您必须使用验证组和 showAllMessages

http://jsfiddle.net/U3QZU/1/

this.errors = ko.validation.group(this);
this.errors.showAllMessages();

【讨论】:

    【解决方案2】:

    验证问题列表中的此问题描述了行为:https://github.com/Knockout-Contrib/Knockout-Validation/issues/211

    建议的解决方法:

    使用vm.name.isModified(true)vm.name.valueHasMutated() 触发更新。 http://jsfiddle.net/RainerAtSpirit/v6dek/6/

    ko.validation.init({
    
        messagesOnModified: false
    });
    
    var vm = {
        name: ko.observable().extend({
            required: true
        })
    };
    vm.name.isModified(true) // or alternatively vm.name.valueHasMutated();
    ko.applyBindings(vm);
    

    【讨论】:

    • 谢谢。这很好用。测试后我有另一个问题:) 如果我不想在屏幕加载时显示消息,但只有当用户从文本框导航(文本框失去焦点)并且没有值更改时。我希望我有一些意义,让我举个例子。我有一个需要“true”的文本框,但第一次加载时,文本框是空白的。现在,如果用户导航到该文本框(专注于文本框)并且不做任何事情(不输入,而只是从文本框中跳出标签)移出文本框,那么只有我想显示消息。跨度>
    • 不要劫持你自己的问题;-)。研究 stackoverlflow 上的新问题和验证问题列表,如果找不到答案,请提出新问题。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2013-03-03
    • 2014-10-17
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多