私はSPAアプリケーション(durandaljs)を持っています。フェッチしたいエンティティの "id"をマップする特定のルートがあります。Breezejs EntityManager MetadataStoreとfetchEntityByKey
テンプレートは "/#/ todoDetail /:id"です。
たとえば、「/#/ todoDetail/232」または「/#/ todoDetail/19」と入力します。
viewmodelのactivate機能については、私はIDを取得できるようにルート情報を取得します。次に、breezejs EntityManagerの新しいインスタンスを作成して、指定されたIDを持つエンティティを取得します。
問題は、manager.fetchEntityByKey( "Todos"、id)を呼び出すときにEntityManagerがサーバーからのメタデータをまだ持っていないため、例外をスローしています "名前で 'Type'を見つけることができません:トドス "。
最初にfetchEntityByKeyを呼び出す前に、ストア(manager.executeQuery)に対してクエリを実行した場合にのみ機能します。
これは予期しない動作またはバグですか? EntityManagerのインスタンス化中にメタデータをオートフェッチする方法はありますか?
注:ユーザーがブラウザに直接ルートを入力できるようにするため、私のケースでは共有EntityManagerを使用するのは難しいと思います。
EDIT:一時的な回避策として、私はこれをやっている:あなたはおよそfetchMetadata
を学んだ
BreezeService.prototype.get = function (id, callback) {
var self = this;
function queryFailed(error) {
app.showMessage(error.message);
callback({});
}
/* first checking if metadatastore was already loaded */
if (self.manager.metadataStore.isEmpty()) {
return self.manager.fetchMetadata()
.then(function (rawMetadata) {
return executeQuery();
}).fail(queryFailed);
} else {
return executeQuery();
}
/* Now I can fetch */
function executeQuery() {
return self.manager.fetchEntityByKey(self.entityType, id, true)
.then(callback)
.fail(queryFailed);
}
};
sugestionが良いので、ファクトリを持つentityManagersを作成し、それらの間でグローバルにメタデータを共有します。ところで、この施設を追加するために風を改善する機会はありますか?メタデータの世界的な例のようですか?または、サービスに対して完全なクエリを実行せずにentityManagerにfetchEntityByKeyだけを要求してもメタデータをクエリするように強制しますか? –
あなたは何を意味するのかよく分かりません。私はBreezeで定義されたデフォルトのMetadataStoreに熱心ではありませんが、それは自分で簡単に作成できるものです。 MetadataStoreにfetchMetadata(これはもちろん非同期)をクエリとは別のものにすることができます(私の答えでこれを述べました)。また、 'EntityManager.createEmptyCopy'を見るかもしれません。マスターEMでそれを呼び出すと、完全に構成された新しい空のEMを作成できます。残りのファクトリメソッドは、コピーから必要なエンティティ(参照リストなど)だけをマスターからインポートします。 – Ward