6

使用由 SharePoint 支持的微风,如此所述,并使用 TypeScript 而不是 JS。

在 DataService 类中,我创建一个 EntityManager 并执行一个查询:

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);
    });
}

检查结果项后,我可以看到它只是普通数据对象,具有我期望的所有属性,但没有实体优点:

在此处输入图像描述

我刚刚开始使用微风,所以提出问题的最佳方式可能是:我在这里做错了什么?

4

2 回答 2

5

如果 Breeze 在其元数据中找不到与它作为查询结果接收的匹配类型,它只会返回“原始”json 对象。

您的元数据不可用的原因通常是由于以下两种解释之一:

1)您没有序列化查询响应中的类型信息。[BreezeController] 属性或 [BreezeJsonFormatter] 属性都实现了这一点。

2) 查询本身不返回描述了元数据的类型。在这种情况下,您可以直接在客户端上创建元数据,也可以通过“元数据”方法从服务器返回。(有关第一个示例,请参见 Breeze Zip 包中的 NoDb 示例)。

如果您想将任何查询结果强制转换为“已知”元数据类型,您还可以查看 JsonResultsAdapter,但如果您使用 [BreezeController] 属性,这通常不是必需的。

希望这可以帮助。

于 2013-03-20T20:32:07.407 回答
2

以下答案不是我的,而是OP的。它发布在问题本身中,而它应该有答案。


问题是命名空间不匹配。我正在从 Visual Studio 服务引用生成的 edmx 中提取元数据。此 edmx 使用它正在调用的服务的命名空间。我的代理对象位于不同的命名空间中。Breeze 的实体查找(即使使用短名称)的格式为 Type#Namespace,所以我没有得到任何匹配。我在服务器上调整了我的自定义 BuildJsonMetadata 方法以交换命名空间,现在我已经正确装饰了可以正常工作的实体。

于 2014-07-02T16:45:07.750 回答