Durandal SPA プロジェクトで Breeze を使用しています。
検索結果ページに要素のリストがあります。ユーザーが 1 つの要素をクリックするたびに、そのアイテムが他のユーザーによってロックされていないことを確認するためにサーバーにクエリを実行します。この場合、モーダル ダイアログを表示して、現在誰がアイテムをロックしているかをユーザーに警告します。
以下の最初のシナリオではうまく機能します。
シナリオ 1:
- t: 要素 E はロックされていません。
- t+1: 検索結果ページで要素 E がクリックされた
- t+2: サーバーに問い合わせて、この要素のロックを確認します (結果: ロックされていません)
- t+3: 要素 E の詳細ページを表示します
シナリオ 2:
- t: 要素 E はロックされていません。
- t+1: 検索結果ページで要素 E がクリックされた
- t+2: サーバーに問い合わせて、この要素のロックを確認します (結果: John によってロックされました)
- t+3: モーダル ポップアップを表示して、John が要素をロックしたことをユーザーに警告します
- t+4: ジョンが要素 E を解放した
- t+5: 検索結果ページで要素 E が再度クリックされた
- t+6: サーバーに問い合わせて、この要素のロックを確認します (結果: ポールによってロックされました)
- t+7: モーダル ポップアップを表示して、Paul が要素をロックしたことをユーザーに警告します。
- t+8: ポールがエレメント E をリリース
(したがって、現時点では誰も要素をロックしていません --> LockedBy は null である必要があります)
- t+9: 検索結果ページで要素 E が再度クリックされた
- t+10: サーバーに問い合わせて、この要素のロックをチェックします (結果: Paul によってロックされました) <- !!!!
ご覧のとおり、問題は 2 番目のシナリオのステップ 10 で発生します。値が null (LockedBy) のときはいつでも、そよ風はまだこのプロパティに古い値を使用しているようです?!
何か案が?
以下は、Breeze でサーバーにクエリを実行するための私のコードです。
var getTransportById = function (transportId, transportObservable) {
// Input: transportId: the id of the transport to retrieve
// Output: transportObservable: an observable filled with the transport
var query = entityQuery.from('Transports')
.where('id', '==', transportId)
.expand("Sender.City, Sender.City.Country, Receiver.City, Receiver.City.Country, Insurances, Client.City, Client.City.Country, LockedBy");
query = query.using(breeze.FetchStrategy.FromServer);
return manager.executeQuery(query)
.then(querySucceeded)
.fail(queryFailed);
function querySucceeded(data) {
transportObservable(data.results[0]);
}
};
以下は私のモデルの一部です:
public class Transport
{
[Key]
public int Id { get; set; }
public string TransportNumber { get; set; }
public string Remark { get; set; }
public int? LockedById { get; set; }
public DateTime? LockedTime { get; set; }
public virtual User LockedBy { get; set; }
}
PS: ブラウザーでトラフィック データを分析すると、Breeze はナビゲーション プロパティが null の場合、データを送信しなかったようです。したがって、私のシナリオでは、他の誰か (別のセッションの別のユーザー) がこのデータを変更したため、クライアント キャッシュの値が正しくなくなり、Breeze が null 値でプロパティを送信しなかったため、クライアント キャッシュが正しく更新されませんでした。私がはっきりしていることを願っています。