我正在使用Knockout-Validation来检查用户输入的某些字段是否有效。我正在一个微风实体上扩展属性来做到这一点。以下是我的扩展程序:
var employeeInitializer = function (employee) {
employee.FirstName = ko.observable().extend({ minLength: 2, required: true });
employee.LastName = ko.observable().extend({ minLength: 2, required: true });
employee.TargetRate = ko.observable().extend({ min: 0, required: true });
var validation = ko.validatedObservable({
firstName: employee.FirstName,
lastName: employee.LastName,
targetRate: employee.TargetRate
});
employee.isValid = ko.computed(function () { return validation.isValid() });
}
manager.metadataStore.registerEntityTypeCtor("Employee", null, employeeInitializer);
现在,当我对这三个字段中的任何一个进行更改时,不会跟踪更改。如果用户正在编辑员工,但决定取消他们的编辑,那么我应该可以在视图模型中调用下面的行。
self.employee.entityAspect.rejectChanges();
但是,即使应该存在,entityAspect也没有跟踪任何更改。如果我从属性中删除扩展,那么一切正常。任何想法为什么会发生这种情况?
答案 0 :(得分:0)
我无法想到使用Breeze实体进行KO验证的充分理由。 Breeze实体已将验证合并为explained here。您还可以在Brian Noyes Pluralsight course on Breeze中了解相关信息。
我对KO验证的了解不足以解释您使用KO验证对可观察量的扩展如何打破Breeze更改跟踪。如果我不得不猜测,我猜测扩展行为会用Breeze所知的新观察结果取代原始的可观测量。因此,对这些新观察者的更改不会传播到位于每个实体核心的Breeze后备存储;从实体的角度来看,一切都没有改变。
我不是说这是真正的解释。我建议这是一种可能性......你可以通过比较employee.FirstName
在扩展之前和之后返回的可观察属性来验证。我猜它们不一样。
无论是否真实,我建议您放弃KO验证,转而使用Breeze原生验证。
我们欢迎您对KO验证为您做什么的想法,Breeze验证不是。
我有些怀疑,但我想听听你的意见。