使用SharePoint支持的breeze,如here所述,并使用TypeScript而不是JS。
在DataService类中,我创建了一个EntityManager并执行Query:
private servicePath: string = '/api/PATH/';
private manager: breeze.EntityManager;
constructor() {
this.init();
}
private init(): void {
this.manager = new breeze.EntityManager(this.servicePath);
}
public ListResponses(): breeze.Promise {
var query = breeze.EntityQuery.from("Responses");
return this.manager.executeQuery(query);
}
然后我从我的视图模型中调用它,它工作正常:
private loadResponses(): void {
this.dataservice.ListResponses().then((data) => {
this.handleResponsesLoaded(data);
}).fail((error) => {
this.handleDataError(error);
});
}
private handleResponsesLoaded(data:any): void {
for (var i = 0; i < results.length; i++){
this.extendItem(results[i]);
}
this.renderList(results, "#tp-responses-list");
}
但我尝试扩展每个项目失败,因为项目的entityAspect
为空:
private extendItem(item: any): void {
item.entityAspect.propertyChanged.subscribe(() => { // FAILS HERE
setTimeout(() => {
if (item.entityAspect.entityState.isModified()) {
this.dataservice.SaveChanges().then((result) => {
tracer.Trace("SaveChanged Result: " + result);
}).fail((error) => {
this.handleDataError(error);
});
}
}, 0);
});
}
在检查结果项时,我可以看到它只是普通的数据对象,具有我期望的所有属性,但没有实体的好处:
我刚刚开始使用微风,所以提出问题的最佳方法可能是:我在这里做错了什么?
答案 0 :(得分:5)
如果Breeze在其元数据中找不到与查询结果相同的匹配类型,它只返回“原始”json对象。
您的元数据不可用的原因通常是由于以下两种解释之一:
1)您没有在查询响应中序列化类型信息。 [BreezeController]属性或[BreezeJsonFormatter]属性都可以实现这一目标。
2)查询本身不返回描述元数据的类型。在这种情况下,您可以直接在客户端上创建元数据,也可以通过“元数据”方法从服务器返回元数据。 (有关第一个示例,请参阅Breeze Zip包中的NoDb示例。)
如果要将任何查询结果强制转换为“已知”元数据类型,也可以查看JsonResultsAdapter,但如果使用[BreezeController]属性,则通常不需要这样做。
希望这有帮助。
答案 1 :(得分:2)
以下答案不是我的,而是OP的。它是在问题本身中发布的,但应该有答案。
问题是命名空间不匹配。我正在从Visual Studio服务引用生成的edmx中提取元数据。此edmx使用它正在调用的服务的命名空间。我的代理对象驻留在不同的命名空间中。 Breeze的实体查找(即使使用短名称)采用Type#Namespace格式,因此我没有匹配。我在服务器上调整了我的自定义BuildJsonMetadata方法来交换命名空间,现在我已经正确装饰了可以正常工作的实体。