Breeze を使用してデータをクエリするアプリがあります。最初にローカル キャッシュをチェックし、結果が返されない場合はサーバー キャッシュをチェックします (John Papa の SPA ジャンプスタート コースに従いました)。ただし、ロジックに欠陥があり、修正方法がわかりません。クエリに一致するアイテムが 10 個あるとします。
状況 1 (動作): 10 個すべてを表示するリスト ページ (ページ A) に移動します。キャッシュが空であるためサーバーにヒットし、10 個すべてをキャッシュに追加します。次に、キャッシュにある 1 つの結果を表示しているページ (ページ B) に移動します。だからすべて良い。
状況 2 (問題): 最初に 1 件のレコードが表示されているページ (ページ B) に移動します。次に、キャッシュをチェックして 1 つのレコードを見つけるリスト ページ (ページ A) に移動します。この行 ( if (recordsInCache.length > 0)
) のために終了し、その 1 つのレコードのみが表示されます。
私はどういうわけか、キャッシュにないサーバー (9) にもっと多くのレコードがあることを知る必要があります。このクエリの合計レコードは実際には 10 です。1 つあるため、残りの 9 についてはサーバーにアクセスする必要があります。
ページ A に対するクエリは次のとおりです。
function getDaresToUser(daresObservable, criteria, forceServerCall)
{
var query = EntityQuery.from('Dares')
.where('statusId', '!=', enums.dareStatus.Deleted)
.where('toUserId', '==', criteria.userId)
.expand("fromUser, toUser")
.orderBy('deadlineDate, changedDate');
return dataServiceHelper.executeQuery(query, daresObservable, false, forceServerCall);
}
そして、これがページB(単一アイテム)に対する私のクエリです
function getDare(dareObservable, criteria, forceServerCall)
{
var query = EntityQuery.from('Dares')
.expand("fromUser, toUser")
.where('dareId', '==', criteria.dareId);
return dataServiceHelper.executeQuery(query, dareObservable, true, forceServerCall);
}
function executeQuery(query, itemsObservable, singleEntity, forceServerCall)
{
//check local cache first
if (!manager.metadataStore.isEmpty() && !forceServerCall)
{
var recordsInCache = executeLocalQuery(query, itemsObservable, singleEntity);
if (recordsInCache.length > 0)
{
callCompleted();
return Q.resolve();
}
}
return manager.executeQuery(query)
.then(querySucceeded)
.fail(queryFailed);
}
function executeLocalQuery(query, itemsObservable, singleEntity)
{
var recordsInCache = manager.executeQueryLocally(query);
if (recordsInCache.length > 0)
{
processQueryResults(recordsInCache, itemsObservable, singleEntity, true);
}
return recordsInCache;
}
アドバイスをいただければ幸いです...