3

SPAでbreeze.jsを使用していますが、サーバーから読み込まれたエンティティに問題があります。つまり、メタデータから(を使用してmetadataEntityType.createEntity())作成され、エンティティマネージャーに追加されたエンティティには、サーバー側モデルなどのすべてのプロパティがあり、ノックアウトでバインドする準備ができています。これはすばらしいことです。

問題は、を使用するentityModel.EntityQuery.from("WorkOrders")と、promiseに渡すsuccessCallbackが.then、値== nullのすべてのプロパティが欠落しているバニラjsオブジェクトの配列を含むresultsプロパティを持つデータオブジェクトを取得することです(これはまさにサーバーがそれを送信する方法です)データはネットワーク経由ですが、breezeにはクライアント上のすべてのメタデータがあり、それらが存在することを知るためにすべてのプロパティを必要としないため、このように意図されていると思います)。

createEntity()のような本格的なノックアウトオブジェクトを作成できるカスタムコンストラクターがありますが、breezeがこれを自動的に処理できるようにするためのより良い方法があるはずだと思います。これらのオブジェクトはすでに存在しているはずなので、エンティティマネージャーに追加する必要があるかどうかはわかりません。また、を使用して保存するカスタムコンストラクターを登録しましentityManager.metadataStore.registerEntityTypeCtorたが、成功コールバックの取得内容は変わりません。常に、次のようなプレーンJSONです。サーバーから送信されました。

更新: jsonペイロードを返すためにサーバーで呼び出されるメソッドのコードは

[HttpGet]
public IQueryable<WorkOrder> WorkOrders()
{
    return (IQueryable<WorkOrder>)_contextProvider.Context.WorkOrders;
}

@Jayがその回答とコメントで指摘したように、それが行動の原因である可能性があります。返されるJSONペイロードは次のとおりです。

[{"$id":"1","$type":"WorkOrders.Domain.Models.WorkOrder, WorkOrders.Domain","Approved":false,"DateModified":"2013-01-02T22:31:20.897","RequestForEstimate":false,"Id":5}]
4

2 に答える 2

3

この問題は、モデルをホストしていた DbContext/ObjectContext とは異なる名前空間にあるモデルが原因でした。以前は、これは既知の制限として文書化されていました。

v 0.83.2 以降、breeze では、モデルの名前空間を DbContext/ObjectContext 名前空間とは異なるものにすることができるようになりました。

これで問題が解決するかどうかを確認してください。

ありがとう

于 2013-01-06T07:53:33.797 に答える
1

あなたが求めていることを理解しているかどうかはよくわかりません。サーバー上の null 値を持つプロパティを、未定義ではなく null 値で Breeze クライアントに返したいということですか、それとも問題がありませんか?

これが問題である場合は、必要なものが役立つことに同意し、機能リクエストとして追加します.

もう 1 つの可能性として、初期化関数を渡すことができる 'registerEntityTypeCtor' メソッドの 3 番目のパラメーターを使用する方法があります。この関数は、構築中のエンティティごとに 1 回呼び出されます。これは、エンティティが既に具体化された後です。これは、プロパティまたはオブジェクトを反復処理して、「未定義」の値を持つものを「null」に設定できることを意味します

これは理にかなっていますか?

于 2013-01-04T00:07:11.223 に答える