【问题标题】:Knockout validation - Validation group not triggering for different error updates?淘汰赛验证 - 验证组不会触发不同的错误更新?
【发布时间】:2013-10-14 21:55:14
【问题描述】:

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

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

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

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

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

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

  • 需要
  • 分钟长度:3
  • 最大长度: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();
            };

【问题讨论】:

标签: knockout.js knockout-validation


【解决方案1】:

我在 ko 验证中遇到过好几次失误。它似乎在带有简单模型的简单页面上效果最好。我发现我需要添加这样的验证选项:

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

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

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

让我知道这是否有效。

【讨论】:

    【解决方案2】:

    嗯,看起来这是来自旧版本 Knockout (v1.0.1) 的错误。

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

    这是上面相同代码的 JS Fiddle,按预期工作: 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 个版本。

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 2013-10-24
      • 2017-04-30
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多