我有一个带有错误集合的视图模型,我将其绑定到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>
问题是验证摘要中显示的错误并不总是最新的。如果我在金额上触发错误,则集合中的错误是正确的,但是如果我触发金额的其他错误,它就不会更改错误集合中的内容,即使它确实在字段旁边显示正确的错误。要获得正确的错误集合,一个字段必须在有效和无效之间更改状态。如果字段从一个无效状态更改为另一个无效状态,则不会更新错误集合。
这是我为展示这个例子而创建的小提琴。