淘汰验证 - 验证组不会触发不同的错误更新?

时间:2013-10-08 05:37:08

标签: knockout.js knockout-validation

我正在尝试设置验证组,以便在按下按钮后显示错误。

我的问题每次验证错误发生更改时,我都无法让验证组正确更新。

在我的示例中,每次离开文本框(预期)时,我都可以正确地看到字段observable更新的.errors属性。对于验证组,文档指向调用.showAllMessages()或评估组本身。

我在下面创建了一个示例。我看到的行为摘要:

  • 加载时,“必需”验证消息显示(ok)
  • 每当验证错误在字段上发生更改时,验证组都不会更新(grrrr)
  • 一旦该字段完全有效,验证组将更新(ok)
  • 一旦该字段生效后变为无效,它将使用第一条验证消息进行更新,但不会像上面那样正确更新。

在示例中,我在单个字段上设置了这些验证:

  • 需要
  • minLength:3
  • maxLength:10
  • 数字

观点:

<label>Test number</label>
    <input type="text" data-bind="value: myNumber"/>
    <div>myNumber error: <span data-bind="text: myNumber.errors"/></div>

<div>Validation group: 
    <ul data-bind="foreach: validationGroup"><li data-bind="text: $data"></li></ul>
</div>

<button type="submit" class="btn" data-bind="click: testValidate">Update validation group</button>

视图模型:

var viewModel = {
        myNumber: ko.observable().extend({
                    maxLength: 10,
                    number: {
                        message: "Please ensure that myNumber contains only numeric characters"
                    },
                    required: {
                        message: "myNumber is required"
                    },
                    minLength: 3
                })
            };

viewModel.validationGroup = ko.validation.group([viewModel.myNumber]);

viewModel.testValidate = function () {
                            // Try both, to be sure...
                viewModel.validationGroup.showAllMessages();

                viewModel.validationGroup();
            };

2 个答案:

答案 0 :(得分:0)

我已经通过ko验证击中并错过了。它似乎在简单模型的简单页面上工作得最好。我发现我需要添加如下验证选项:

var validationOptions = {
    decorateElement: true,
    registerExtenders: true,
    messagesOnModified: true,
    insertMessages: false,
    parseInputAttributes: true,
    messageTemplate: null,
    grouping: {
        deep: true
    },
};

然后当我应用绑定时,我使用

ko.applyBindingsWithValidation(self, $id, validationOptions);

如果有效,请告诉我。

答案 1 :(得分:0)

好吧,看起来这是旧版Knockout(v1.0.1)中的一个错误。

最新发布的版本是v1.0.2(从2012年9月开始),下面的工作示例来自GitHub最新版本:( 2013年10月修改)

这是上面相同代码的JS小提琴,按预期工作: http://jsfiddle.net/overflew/JhWZq/1/

所以.showAllMessages()就是更新组所需的全部内容:

viewModel.testValidate = function () {
    viewModel.validationGroup.showAllMessages();
};

使用旧版本结束的原因:KO Validation via NuGet(Microsoft .NET的软件包管理工具)最后更新于2013年6月w / v1.0.1,现在已落后1或2个版本。