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