我遇到了问题,我扩展了Entity以暴露hasValidationError。没有它,它工作正常。另外我发现如果我在添加实体之前提供ID,它也可以正常工作。为什么在客户端上扩展实体后,ID字段不会自动生成。
我现在使用的是不同版本的代码(我发现以这种方式扩展实体更直观),但它仍然以同样的方式出错。
var Country = function () {
console.log("Country initialized");
var self = this;
self.Country_ID = ko.observable("");
self.Country_Code = ko.observable("");
self.Country_Name = ko.observable().extend({
validation: {
validator: function (val, someOtherVal) {
return false;//val === someOtherVal;
},
message: 'Invalid Value!',
params: 5
}
});
var prop = ko.observable(false);
var onChange = function () {
var hasError = self.entityAspect.getValidationErrors().length > 0;
if (prop() === hasError) {
// collection changed even though entity net error state is unchanged
prop.valueHasMutated(); // force notification
} else {
prop(hasError); // change the value and notify
}
};
// observable property is wired up; now add it to the entity
self.hasValidationErrors = prop;
//dummy property to wireup event
//should not be used for any other purpose
self.hasError = ko.computed(
{
read: function () {
self.entityAspect // ... and when errors collection changes
.validationErrorsChanged.subscribe(onChange);
},
// required because entityAspect property will not be available till Query
// return some data
deferEvaluation: true
});
self.fullName = ko.computed(
function () {
return self.Country_Code() + " --- " + self.Country_Name();
});
};
store.registerEntityTypeCtor("Country", Country);
然后在按钮单击中我使用以下代码创建新实体。
var countryType = manager.metadataStore.getEntityType("Country");
var newCountry = countryType.createEntity();
//newCountry.Country_ID(200); //if i add this line no errors occurs
newCountry.Country_Code("India");
self.list.push(newCountry);
manager.addEntity(newCountry); // validation error occurs right after this line
self.selectedItem(newCountry);
self.list.valueHasMutated();
答案 0 :(得分:0)
也许没有任何错误。你怎么知道id生成失败了?将newCountry添加到管理器后是否为负数?应该是。
您获得的验证错误是什么?它与Country_ID有关吗?也许您在Country_ID上有验证约束(例如,最小值)
addhasValidationErrorsProperty
实体初始值设定项按预期工作。我刚刚在DocCode示例中添加了一个教学测试(参见“在entityExtensionTests.js中注册addhasValidationErrorsProperty初始化程序后可以创建员工”)。我写这篇文章时没有部署它,但你可以从GitHub获得它。
我尽可能地使用具有身份标识(Employee_ID)的Northwind Employee
实体。测试显示添加了我在上一篇文章中写的初始化程序(而不是你可能已经重写过它)。它表示在添加到管理器之前新的Employee的id为零,并且在添加到管理器后变为-1。 -1是新员工的临时ID;保存后它会收到一个永久值。
设置EntityManager的默认validationOptions
,以便在将实体附加(或添加)到管理器时对其进行验证。您可以根据自己的需要更改该行为。
新员工在创建时处于无效状态;它缺少必需的First和Last名称值(测试显示这些错误)。因此,在将新员工添加到经理后,hasValidationErrors
observable变为true
,hasValidationErrors
observable会发出Knockout UI会听到的更改通知;这些测试显示了这两点。