ko.validation.group并不总是与显示的错误保持同步

时间:2013-03-10 23:36:07

标签: knockout.js knockout-validation

我有一个带有错误集合的视图模型,我将其绑定到ASP.NET MVC样式验证摘要。问题是错误集合并不总是与模型的当前状态保持同步。

function CostEditViewModel() {
    var self = this;
    self.description = ko.observable().extend({ required: { message: "Please enter the description", params: true } });
    self.amount = ko.observable()
        .extend({ required: { message: "Please enter the amount", params: true } })
        .extend({ number: { message: "The amount is not valid", params: true } });
    self.displayErrors = ko.observable(false);
    self.errors = ko.validation.group(self);

    self.add = function() {
        self.edit(new Cost({ Description: '', Amount: '' } ));
    };

    self.edit = function(cost) {
        self.description(cost.Description());
        self.amount(cost.Amount());
        self.displayErrors(false);

        self.description.isModified(false);
        self.amount.isModified(false);
    };

    self.save = function() {
        if (self.isValid()) {
            DoAjaxSave();
        } else {
            self.displayErrors(true);
        }
    };
}

然后我将错误绑定到UL

<div class="alert alert-error" data-bind="visible: displayErrors() && errors().length > 0">
    <ul data-bind="foreach: errors">
        <li data-bind="text: $data"></li>
    </ul>
</div>

问题是验证摘要中显示的错误并不总是最新的。如果我在金额上触发错误,则集合中的错误是正确的,但是如果我触发金额的其他错误,它就不会更改错误集合中的内容,即使它确实在字段旁边显示正确的错误。要获得正确的错误集合,一个字段必须在有效和无效之间更改状态。如果字段从一个无效状态更改为另一个无效状态,则不会更新错误集合。

这是我为展示这个例子而创建的小提琴。

http://jsfiddle.net/e4LHV/2/

0 个答案:

没有答案