Javascript 为什么我的查询项的entityAspect为空?

Javascript 为什么我的查询项的entityAspect为空?,javascript,sharepoint,typescript,edmx,breeze,Javascript,Sharepoint,Typescript,Edmx,Breeze,如前所述,使用SharePoint支持的breeze,并使用TypeScript而不是JS 在DataService类中,我创建EntityManager并执行查询: private servicePath: string = '/api/PATH/'; private manager: breeze.EntityManager; constructor() { this.init(); } private init(): void { this.manager = new

如前所述,使用SharePoint支持的breeze,并使用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");
}
检查结果项后,我可以看到它只是一个普通的数据对象,具有我期望的所有属性,但没有实体属性:


我刚从breeze开始,所以最好的提问方式可能是:我在这里做错了什么?

如果breeze在元数据中找不到与查询结果相匹配的类型,它只返回“原始”json对象

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

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

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

如果要将任何查询结果强制转换为“已知”元数据类型,也可以查看JsonResultsAdapter,但如果使用[BreezeController]属性,则通常不需要这样做


希望这有帮助。

下面的答案不是我的,而是OP的。它被张贴在问题本身,而它应该有一个答案。



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

Jay-感谢您的及时响应。我正在使用从服务引用的edmx中提取的元数据,但这肯定有问题-我将尝试修复它(我有很多实体类型,如果我可以帮助的话,我不想在客户端手动应用元数据)。因此,有一个简单的后续问题:breeze如何将类型与元数据匹配?它是基于类型名还是基于属性映射(如接口或…)?您可以通过其getEntityTypes方法获取metadataStore包含的类型列表。每个实体类型都有一个“name”和一个“shortName”属性,这两个属性都可以匹配。我将在上午查看。再次感谢。将跟踪添加到
getEntityType
帮助我很快找到了问题。见上文决议。感谢您的帮助。JcFx,我们有兴趣在将Breeze与Sharepoint集成方面做得更好,但对Sharepoint的知识非常缺乏。你似乎拥有更多。我们希望获得更多关于如何最好地实现我们的目标的信息。你愿意和我联系吗breeze@ideablade.com.
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);
    });
}