SPA アプリケーション (durandaljs) があり、取得するエンティティの「id」をマップする特定のルートがあります。
テンプレートは「/#/todoDetail/:id」です。
たとえば、「/#/todoDetail/232」または「/#/todoDetail/19」などです。
viewmodel の activate 関数でルート情報を取得するので、ID を取得できます。次に、breezejs EntityManager の新しいインスタンスを作成して、指定された ID を持つエンティティを取得します。
問題は、manager.fetchEntityByKey("Todos", id) を呼び出すと、EntityManager がサーバーからのメタデータをまだ持っていないため、「名前で「タイプ」を見つけることができません: Todos」という例外がスローされることです。
fetchEntityByKey を呼び出す前に、最初にストア (manager.executeQuery) に対してクエリを実行した場合にのみ機能します。
これは予想される動作ですか、それともバグですか? EntityManager のインスタンス化中にメタデータを自動フェクトする方法はありますか?
注: 私の場合、ユーザーがブラウザーでルートを直接入力できるようにするため、共有 EntityManager を使用するのは難しいと思います。
編集:一時的な回避策として、私はこれをやっています:
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);
}
};