0

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

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

在我的示例中,每次离开文本框(预期)时,我都可以正确地看到字段 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();
            };
4

2 回答 2

0

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

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

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

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

让我知道这是否有效。

于 2013-10-08T07:44:50.653 回答
0

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

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

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

So the .showAllMessages() is all that's required to update the group:

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

Reason for winding up with the old version: KO Validation via NuGet (Microsoft .NET's package management tool) was last updated June 2013 w/v1.0.1, which is now 1 or 2 versions behind.

于 2013-10-09T05:12:54.437 回答