カレンダーアプリケーションがあり、ajaxとjsonの結果を使用してすべてのイベントデータをロードします。問題は、ビューが異なることです。現在、ビューを変更するときにサーバーを再度呼び出す必要があります。
クライアント側でこのデータをキャッシュし、さらにajax呼び出しを開始する前に、これらのイベントを既にロードしているかどうかを確認する方法についての推奨事項はありますか?
このためのベストプラクティスは何ですか?
カレンダーアプリケーションがあり、ajaxとjsonの結果を使用してすべてのイベントデータをロードします。問題は、ビューが異なることです。現在、ビューを変更するときにサーバーを再度呼び出す必要があります。
クライアント側でこのデータをキャッシュし、さらにajax呼び出しを開始する前に、これらのイベントを既にロードしているかどうかを確認する方法についての推奨事項はありますか?
このためのベストプラクティスは何ですか?
hvgotcodesが言ったように、MVCフレームワークが役立ちます。たとえば、backbone.js(http://documentcloud.github.com/backbone/)を試してください。
または、jStorage(http://www.jstorage.info/)の使用を検討することもできます。AJAX呼び出しを行う必要があるたびに、最初にそれがストレージオブジェクトにあるかどうかを確認し、そうでない場合はAJAX呼び出しを実行します。一方、AJAX呼び出しを終了するたびに、結果をストレージオブジェクトに保存します。データストアで検索するときに参照する何らかのインデックス(CalendarEvent ID)があることを確認してください。ストレージ内のデータにもある種の「有効期限」を追加したい場合があります...AJAX呼び出し後のタイムスタンプ、および古い場合は事前に再リクエストしてください。
MVCといいます。
アプリケーションのデータ モデルを構築し、ある種の Record オブジェクトを作成する必要があります。その後、それらのステータスを判断できます。したがって、アプリケーションにはある種のCalendarEvent
モデルがあり、サーバーからデータをロードするときにインスタンスをインスタンス化します。
したがって、ビューを変更するときは、まずそのビューのモデル オブジェクトがあるかどうかを確認します。ある場合は、サーバーから読み込む必要はありません (変更を確認する場合を除きます)。
スキームはそれほど複雑である必要はありません。Id でイベントをロードすると、次のようなことができます
window.App = {};
window.App.Models = {};
置くことができるレコードをロードするとき
window.App.Models[id] = InstanceOfYourRecord
そうすれば、レコードを探すのがかなり速くなります。または、堅牢なデータ層を持つフレームワーク (Sproutcore など) を使用するだけです。
最近のプロジェクトでも同様の問題がありました。
概念的には、「実際の」データ モデル (DM) をサーバーに保持し、データベースに永続化します。
生活を健全にするために、クライアントは独自のローカル データ モデルを保持します。クライアント DM の外部では、すべてのクライアント コードは結果をローカルにプルしていると考えます。
クライアント DM からデータを読み取る (GET) 場合:
クライアント DM 経由でデータを変更 (POST) する場合:
このクライアント DM も次の点に注意してください。
実装上の注意:
私の実装での関数の例:
listAll:
function( contactId, cb ) {
// pull from cache
if ( contactId in this.notesCache ) {
cb( this.notesCache[contactId] );
return;
}
// init queue if needed
this.listAllQueue[contactId] = this.listAllQueue[contactId] || [];
// pull from server
var self = this;
dataModelHelpers.getJsonOnce(
'/teafile/api/notes.php',
{'req': 'listAll', 'contact': contactId},
function(resp) { self.notesCache[contactId] = resp; },
this.listAllQueue[contactId],
cb
);
}
getJsonOnce() ヘルパーは、複数のクライアント コンポーネントがまったく同じ (キャッシュされていない) データを要求した場合に、単一の AJAX 要求のみを送信し、受信したら全員に通知するようにします。
notesCache は単純な JavaScript オブジェクトです。
this.notesCache = {};