4

カレンダーアプリケーションがあり、ajaxとjsonの結果を使用してすべてのイベントデータをロードします。問題は、ビューが異なることです。現在、ビューを変更するときにサーバーを再度呼び出す必要があります。

クライアント側でこのデータをキャッシュし、さらにajax呼び出しを開始する前に、これらのイベントを既にロードしているかどうかを確認する方法についての推奨事項はありますか?

このためのベストプラクティスは何ですか?

4

3 に答える 3

2

hvgotcodesが言ったように、MVCフレームワークが役立ちます。たとえば、backbone.js(http://documentcloud.github.com/backbone/)を試してください。

または、jStorage(http://www.jstorage.info/)の使用を検討することもできます。AJAX呼び出しを行う必要があるたびに、最初にそれがストレージオブジェクトにあるかどうかを確認し、そうでない場合はAJAX呼び出しを実行します。一方、AJAX呼び出しを終了するたびに、結果をストレージオブジェクトに保存します。データストアで検索するときに参照する何らかのインデックス(CalendarEvent ID)があることを確認してください。ストレージ内のデータにもある種の「有効期限」を追加したい場合があります...AJAX呼び出し後のタイムスタンプ、および古い場合は事前に再リクエストしてください。

于 2011-12-09T00:36:58.850 に答える
1

MVCといいます。

アプリケーションのデータ モデルを構築し、ある種の Record オブジェクトを作成する必要があります。その後、それらのステータスを判断できます。したがって、アプリケーションにはある種のCalendarEventモデルがあり、サーバーからデータをロードするときにインスタンスをインスタンス化します。

したがって、ビューを変更するときは、まずそのビューのモデル オブジェクトがあるかどうかを確認します。ある場合は、サーバーから読み込む必要はありません (変更を確認する場合を除きます)。

スキームはそれほど複雑である必要はありません。Id でイベントをロードすると、次のようなことができます

window.App = {};
window.App.Models = {};

置くことができるレコードをロードするとき

window.App.Models[id] = InstanceOfYourRecord

そうすれば、レコードを探すのがかなり速くなります。または、堅牢なデータ層を持つフレームワーク (Sproutcore など) を使用するだけです。

于 2011-12-09T00:24:30.507 に答える
0

最近のプロジェクトでも同様の問題がありました。

概念的には、「実際の」データ モデル (DM) をサーバーに保持し、データベースに永続化します。

生活を健全にするために、クライアントは独自のローカル データ モデルを保持します。クライアント DM の外部では、すべてのクライアント コードは結果をローカルにプルしていると考えます。

クライアント DM からデータを読み取る (GET) 場合:

  • 既存の結果のキャッシュをチェックします
  • キャッシュされたデータが利用できない場合に適切な AJAX クエリを呼び出し、結果をキャッシュします。

クライアント DM 経由でデータを変更 (POST) する場合:

  • 必要に応じてキャッシュを無効にします
  • 適切な AJAX クエリを呼び出す
  • クライアント DM が変更されたことを示すカスタム jQuery イベントを発行します

このクライアント DM も次の点に注意してください。

  • AJAX エラー処理を一元化
  • 進行中の AJAX 呼び出しを追跡します。(変更を保存せずにページを離れるときにユーザーに警告します)。
  • すべての呼び出しがローカル データにヒットし、完全に同期する、単体テスト用のドロップインのダミー置換を可能にします。

実装上の注意:

  • これを DataModel という JavaScript クラスとしてコーディングしました。設計がより複雑になるにつれて、責任を個別のオブジェクトにさらに分割することは理にかなっています。
  • jQuery のカスタム イベントを使用すると、オブザーバー パターンを簡単に実装できます。クライアント コンポーネントは、データが変更されたことを示すたびに、クライアント DM から自身を更新します。
  • リモート API の JSON は、コードを簡素化するのに役立ちます。私のクライアント DM は、JSON の結果をキャッシュに直接保存します。
  • クライアント dm 関数の引数にはコールバックが含まれているため、必要に応じてすべてを AJAX 経由で自然に渡すことができます。 function listAll( contactId, cb ) { ... }
  • 私のプロジェクトでは、単一ユーザーのログインしか許可されていませんでした。外部の関係者がサーバーのデータモデルを変更できる場合は、ある種の has-data-changed プローブを定期的に起動して、クライアント キャッシュがまだ有効であることを確認する必要があります。
  • 私のアプリでは、クライアント DM 変更イベントを受信すると、複数のクライアント コンポーネントが同じデータを要求します。これにより、同じ情報を持つ複数の AJAX 呼び出しが発生しました。同じ結果を待つクライアント コンポーネント コールバックのキューを管理する getJsonOnce() ヘルパーを使用して、この問題を修正しました。

私の実装での関数の例:

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 = {};
于 2011-12-09T00:24:36.010 に答える