我们目前正在使用breeze.js(版本1.3.4)开发一个小型Hmtl / JavaScript应用程序。我们配置使用OData协议来查询实体。
使用简单的实体它可以正常工作。如果我们要查询复杂的实体(具有电话号码和地址的两个复杂类型属性的联系实体),我们会收到以下错误:
"TypeError: Cannot call method '_createInstanceCore' of null
at ctor.startTracking (<ServerAddress>/scripts/breeze.debug.js:14086:49)
at Array.forEach (native)
at ctor.startTracking (<ServerAddress>1/scripts/breeze.debug.js:14069:12)
at new ctor <ServerAddress>/scripts/breeze.debug.js:2952:52)
at proto._createEntityCore (<ServerAddress>1/scripts/breeze.debug.js:6478:9)
at mergeEntity <ServerAddress>/scripts/breeze.debug.js:12458:39)
at processMeta (<ServerAddress>/scripts/breeze.debug.js:12381:24)
at visitAndMerge (<ServerAddress>/scripts/breeze.debug.js:12361:16)
at <ServerAddress>/scripts/breeze.debug.js:12316:33
at Array.map (native)
From previous event:
at executeQueryCore (<ServerAddress>/scripts/breeze.debug.js:12290:77)
at proto.executeQuery (<ServerAddress>/scripts/breeze.debug.js:11243:23)
at DataContext.executeCachedQuery (<ServerAddress>/App/services/datacontext.js:138:33)
at DataContext.getContactsBySearchParams (<ServerAddress>/App/services/datacontext.js:111:25)
at Search.searchCmd.ko.asyncCommand.execute (<ServerAddress>/App/viewmodels/search.js:34:38)
at Search.ko.asyncCommand.self.execute (<ServerAddress>/scripts/knockout.command.js:57:29)
at HTMLButtonElement.ko.bindingHandlers.event.init (<ServerAddress>/scripts/knockout-2.2.1.debug.js:2318:66)"
在调试代码时,我们看到,复杂属性实例的dataType字段为null:
val = prop.dataType._createInstanceCore(entity, prop.name);
我们还可以看到complexTypeName具有奇怪的值格式,如:
<ComplexTypeName>):#<NameSpace>
我们注意到有关奇怪的复杂类型名称的另一件事是,entities属性是复杂类型的集合(联系人可能有多个地址)。对14085行的检查总是返回isScalar = true,但应该创建一个复杂的数组。
复杂类型的OData元数据是否存在问题?我们怎么能解决这个问题?
提前感谢您的回答。
干杯, 马克
答案 0 :(得分:0)
Breeze目前支持标量复杂类型和复杂类型数组。
但是使用 EntityManager.createEntity 在一次传递中创建实体及其复杂类型值存在一个错误。这将在大约一周的下一个版本中修复。
所以现在以下内容不起作用。 (假设以下示例中的“位置”是“位置”类型的复杂属性,本身具有其他几个属性)
var supplier = em.createEntity("Supplier",
{ companyName: "XXX", location: { city: "LA" } }
);
但是以下内容(假设您正在使用微风Angular / backingStore impl - 淘汰代码看起来会有所不同)
var supplier = em.createEntity("Supplier", { companyName: "XXX" });
supplier.location.city = "San Francisco";
supplier.location.postalCode = "91333";
或以下
var supplier = em.createEntity("Supplier", { companyName: "XXX" });
var locationType = em.metadataStore.getEntityType("Location");
supplier.location = locationType.createInstance(
{ city: "Boston", postalCode: "12345" }
);
答案 1 :(得分:0)
我看到了与微风1.4.5相同的问题。 我的元数据如下:
{ "shortName":"Phone",
...
"dataProperties":[ {"name":"phoneNumber",
"complexTypeName":"PhoneNumber#mynamespace",
"isScalar":true }]
...
},
{"shortName":"PhoneNumber",
"namespace":"mynamespace",
"isComplexType":true,
"dataProperties":[ ... ]
}
我的客户端代码拨打电话:
var newPhone = manager.createEntity('Phone', {phoneNumber:{num: "234-2342"}});
(PhoneNumber复杂类型中有更多属性,但您还没有图片)。 微风代码(与orignal poster相同的调用堆栈)尝试取消引用未定义的dataType字段,并抛出异常:
if (prop.isDataProperty) {
if (prop.isComplexProperty) {
if (prop.isScalar) {
val = prop.dataType._createInstanceCore(entity, prop);
} else {
val = breeze.makeComplexArray([], entity, prop);
}
我浏览了Zza示例的架构,没有找到复杂数据属性的示例。示例包中包含Northwind架构,但我不确定如何使用我的架构。