6

ここで説明するように、SharePointに裏打ちされたそよ風を操作し、JSではなくTypeScriptを使用します。

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がnullであるため、各アイテムを拡張しようとして失敗します。

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オブジェクトを返します。

メタデータが利用できない理由は、通常、次の2つの説明のいずれかが原因です。

1)クエリ応答のタイプ情報をシリアル化していない。[BreezeController]属性または[BreezeJsonFormatter]属性はどちらもこれを実現します。

2)クエリ自体は、メタデータが記述されたタイプを返していません。この場合、クライアントで直接メタデータを作成するか、「メタデータ」メソッドを介してサーバーからメタデータを返すことができます。(最初の例については、Breeze ZipパッケージのNoDbの例を参照してください)。

クエリ結果を「既知の」メタデータタイプに強制変換する場合は、JsonResultsAdapterを確認することもできますが、[BreezeController]属性を使用している場合は通常これは必要ありません。

お役に立てれば。

于 2013-03-20T20:32:07.407 に答える
2

次の答えは私のものではなく、OPのものです。質問自体に投稿されましたが、答えがあるはずです。


問題は名前空間の不一致でした。VisualStudioサービス参照によって生成されたedmxからメタデータを抽出しています。このedmxは、呼び出しているサービスの名前空間を使用します。私のプロキシオブジェクトは別の名前空間にあります。Breezeのエンティティルックアップ(短い名前を使用している場合でも)はType#Namespaceの形式であるため、一致するものはありませんでした。サーバー上のカスタムBuildJsonMetadataメソッドを微調整して名前空間を交換しました。これで、正しく機能するエンティティが適切に装飾されました。

于 2014-07-02T16:45:07.750 に答える